SQLAlchemy «один ко многим» без первичного ключа в дочерней таблице

Можно ли создать таблицу без первичного ключа в 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 действительно нужно наверстать упущенное.

6
задан Hassan Syed 28 June 2012 в 21:04
поделиться