私はMySQLを使用しています(InnoDBを実行中)、そしてsqlalchemyを使用して全体をラップしました。今、私はslqlalchemy UniqueConstraint VSインデックス(一意= True)
sqlalchemy_utils.functions.create_database(...)
(docs参照)を使用して、私のデータベースの変更を生成したいと思います一般的に上記の機能は、それがすることになっているものを行います。唯一の例外はユニークなインデックスの生成です。
言って、私はこのようなテーブルを定義します。私は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')
私が指定されているようSQLAlchemyのは、すべての列を持つテーブル「MY_TABLE」を作成することになります。外部キーも正常にセットアップされますが、データベース側で一意のインデックスは見つかりません。私は代わりにインデックス(一意= True)を代わりに使用してみました。だからではなく、
u_idx = UniqueConstraint(attr_2, attr_3, 'my_table_uidx')
の私は
u_idx_1 = Index('my_table_uidx', attr_2, attr_3, unique=True)
を置く私の印象は、これは論理的に同様の結果を生成しました。今回は、sqlalchemyが実際にdbに一意のインデックスを作成しました。
UniqueConstraintとIndex(unique = True)の違いや、sqlalchemyがデータベースの生成を自動化するためにそれらを使用する方法について、私は悲惨に誤解しています。
誰もがこれにいくつかの光を当てることができますか?
偉大な説明を!それは多くの意味があります。 Index( 'my_table_uidx'、attr_2、attr_3、unique = True)の実装に固執することについての議論はありますか?現時点では、以前はMySQL Workbenchで手動でセットアップしたのとまったく同じMySQL定義を生成していたので、私はそれに慣れていく傾向がありました。また、Python側でも読むことができました。 –
MySQLを使用している場合、どちらか一方を好む理由はないと思います。とにかくこれを私に言わせてはいけませんが、ユニークな制約としてユニークなインデックスとして実装されています。ただし、すべてのデータベースで同じことが当てはまるとは限りません。もう一度、私はSQL標準に精通しているわけではありません。 –
十分に公正。それは私の直感でした。そうでないことを示唆しているものがあれば投稿します。ありがとう! –