Можно ли создать таблицу без первичного ключа в SQLAlchemy? Отношение I хочу определить следующее:
class TPost(Base):
__tablename__ = "forum_post"
id = Column(Integer, primary_key = True)
topic_id = Column(Integer, ForeignKey("forum_topic.id"))
index = Column(Integer)
page = Column(Integer)
user_id = Column(Integer, ForeignKey("forum_user.id"))
posted_at = Column(DateTime)
post_text = Column(String)
has_quotes = Column(Boolean)
quotes = relationship("TQuote")
class TQuote(Base):
__tablename__ = "forum_quotes"
id = Column(Integer, ForeignKey("forum_post.id"))
is_direct = Column(Boolean)
quoted_text = Column(String)
quoted_id = Column(Integer)
Как видите, мне не нужен первичный ключ, и я не собираюсь расширять отношения Quote
в будущем
Моя проблема конкретно представлено этим сообщением об ошибке:
sqlalchemy.exc.ArgumentError: Mapper Mapper|TQuote|forum_quotes
could not assemble any primary key columns for mapped table 'forum_quotes'
изменить:
Пара (id,quoted_id)
уникальна и присутствует для большинства данных, однако, когда цитата не является прямой (и в этом случае не имеет цитируемого_id), я встраиваю цитируемый text непосредственно в отношения кавычек. Я мог бы использовать подход с двумя таблицами (где непрямые кавычки имеют таблицу с первичным ключом), но я бы предпочел реализовать это как единую связь «один ко многим». Я не хочу делать больше, чем одно соединение.
редактировать 2:
Я буду нумеровать кавычки и использовать внешний ключ + номер, сгенерированный приложением, в качестве pkey, но все равно раздражает. Теперь разберусь с синтаксисом.
редактирование 3:
Решена проблема, описанная в редактировании 2. Сильно раздражает алхимия sql, поскольку в ней есть вся информация, необходимая для реализации взаимосвязи даже при моделировании данных на высоком уровне. Я понимаю причины, по которым Sql Alchemy хочет иметь первичный ключ (облегчает реализацию формы).
Я начинаю задаваться вопросом, почему я использую Sql Alchemy, без него я мог бы реализовать односторонние асинхронные операции UPSERT или CREATE_IF_NOT_EXIST с использованием psycopg2. ORM действительно нужно наверстать упущенное.