【发布时间】:2012-02-16 22:26:21
【问题描述】:
如何使用没有主键的 ORM 声明类创建表?
如果我没有将任何列设为primary_key = True,它将无法启动。
【问题讨论】:
-
请问,你为什么要做这样的事情?
-
@JonathanOng 因为以后想加一些索引,好像mysql可以做这样的事情。
标签: database-design orm sqlalchemy schema
如何使用没有主键的 ORM 声明类创建表?
如果我没有将任何列设为primary_key = True,它将无法启动。
【问题讨论】:
标签: database-design orm sqlalchemy schema
SQLAlchemy 核心不会抱怨缺少主键,因此可以使用Table(…) 创建这样的表。但是ORM在设计上需要一种方法来识别对象对应的行,所以在ORM中不能使用没有主键的表。
为什么以后需要添加这个索引?它是真正的需求还是试图解决一些可能可以通过其他方式解决的问题?如果您需要复合主键,可以使用多个Columns 中的primary_key=True 参数或在__table_args__ 中指定PrimaryKeyConstraint(…) 来定义它。
【讨论】:
Columns中指定primary_key=True即可。 Index(…) 支持显式 B 树(或其他类型)规范,例如适用于 PostgreSQL,但不适用于 MySQL,也不适用于 PrimaryKeyConstraint。看起来 SQLAlchemy 中缺少功能。
__mapper_args__ = {"primary_key":(col1, col2)}}
__mapper_args__ 只是将这些列映射为主要列,它不会发出 CREATE TABLE 语句。否则在此处更新一个特定的代码示例以及无法正常工作的部分。