6

是否可以在 SQLAlchemy 中创建没有主键的表?我要定义的关系如下:

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)对是唯一的,它存在于大多数数据中,但是当引用不是直接的(并且在这种情况下没有quoted_id)时,我将引用的文本直接内联到引用关系中。我可以使用双表方法(其中间接引号有一个带有主键的表),但我真的更愿意将其实现为单个一对多关系。我不想只做一个连接。

编辑2:

我会给引号编号并使用外键+应用程序生成的数字作为pkey,仍然很烦人。现在来弄清楚语法。

编辑3:

解决了编辑 2 中概述的问题。对 sql alchemy 非常恼火,因为它具有实现关系所需的所有信息,即使在对数据进行高级建模时也是如此。我了解 Sql Alchemy 想要拥有主键的原因(使 orm 更易于实现)。

我开始质疑为什么我使用 Sql Alchemy,没有它我可以使用 psycopg2 实现一种方式 UPSERT 或 CREATE_IF_NOT_EXIST 异步操作。ORM 真的需要迎头赶上。

4

2 回答 2

14

我假设@TokenMacGuy 是对的,而您确实混淆了PrimaryKey, 和 a的概念surrogate key。在这种情况下,您的问题的答案是:

  • ,SA 不支持没有主键的表(因此不支持与表的关系)
  • 并且,您不需要为每个表创建代理键来充当primary key. 您可以使用具有唯一性的列的任意组合来定义 PK。

有关示例,请参见下面的代码:

class TPost(Base):
    __tablename__ = 'forum_post'
    id = Column(Integer, primary_key = True)
    post_text = Column(String)
    quotes = relationship("TQuote", backref="post")

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) 
    __table_args__ = (PrimaryKeyConstraint(id, quoted_id),)
于 2012-06-29T12:58:50.320 回答
1

添加一个额外的列给引号一个索引,然后添加这个新列+外键的复合键。

于 2012-07-03T10:19:40.617 回答