【问题标题】:SQLAlchemy declarative: table without any primary keys?SQLAlchemy 声明式:没有任何主键的表?
【发布时间】:2012-02-16 22:26:21
【问题描述】:

如何使用没有主键的 ORM 声明类创建表? 如果我没有将任何列设为primary_key = True,它将无法启动。

【问题讨论】:

  • 请问,你为什么要做这样的事情?
  • @JonathanOng 因为以后想加一些索引,好像mysql可以做这样的事情。

标签: database-design orm sqlalchemy schema


【解决方案1】:

SQLAlchemy 核心不会抱怨缺少主键,因此可以使用Table(…) 创建这样的表。但是ORM在设计上需要一种方法来识别对象对应的行,所以在ORM中不能使用没有主键的表。

为什么以后需要添加这个索引?它是真正的需求还是试图解决一些可能可以通过其他方式解决的问题?如果您需要复合主键,可以使用多个Columns 中的primary_key=True 参数或在__table_args__ 中指定PrimaryKeyConstraint(…) 来定义它。

【讨论】:

  • 我打算创建一个多列索引。如果我可以明确声明必须使用 BTREE 构建索引(我的数据库是 MySQL),那就太好了。有什么解决办法吗?
  • 大部分数据库(包括MySQL)默认使用B-Tree,所以在所有参与复合索引的Columns中指定primary_key=True即可。 Index(…) 支持显式 B 树(或其他类型)规范,例如适用于 PostgreSQL,但不适用于 MySQL,也不适用于 PrimaryKeyConstraint。看起来 SQLAlchemy 中缺少功能。
  • 您也可以将“primary”列的列表放入 mapper() 的“primary_key”参数中,声明式__mapper_args__ = {"primary_key":(col1, col2)}}
  • @zzzeek 您提供的代码可能有问题,没有添加任何主多列键。怎么了?
  • __mapper_args__ 只是将这些列映射为主要列,它不会发出 CREATE TABLE 语句。否则在此处更新一个特定的代码示例以及无法正常工作的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
相关资源
最近更新 更多