我正在使用 MySQL(运行 InnoDB),并使用 sqlalchemy 包装整个内容。现在,我想使用(请参阅docs http://sqlalchemy-utils.readthedocs.io/en/latest/database_helpers.html)
sqlalchemy_utils.functions.create_database(...)
一般来说,上面的函数会完成它应该做的事情。唯一的例外是唯一索引的生成。
比如说,我定义了一个这样的表:
## ...
# DeclBase = declarative_base()
## ...
class MyTable(DeclBase):
__tablename__ = 'my_table'
id = Column(Integer, primary_key=True)
attr_1 = Column(String(32))
attr_2 = Column(Integer, nullable=False)
attr_3 = Column(DateTime)
attr_4 = Column(
Integer,
ForeignKey('other_table.id', onupdate='CASCADE', ondelete='CASCADE'),
nullable=False
)
u_idx = UniqueConstraint(attr_2, attr_3, 'my_table_uidx')
当我调用 create_database 时,我将让 sqlalchemy 创建包含指定所有列的表“my_table”。外键也设置得很好,但是在数据库端找不到唯一索引。然后我尝试使用 Index(unique=True) 代替。所以而不是
u_idx = UniqueConstraint(attr_2, attr_3, 'my_table_uidx')
I put
u_idx_1 = Index('my_table_uidx', attr_2, attr_3, unique=True)
我的印象是,这在逻辑上会产生类似的结果。这次 sqlalchemy 确实在数据库上创建了唯一索引。
也许我严重误解了 UniqueConstraint 和 Index(unique=True) 之间的区别,或者 sqlalchemy 使用它们自动生成数据库的方式。
有人能解释一下吗?