2017-04-07 8 views
1

私は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がデータベースの生成を自動化するためにそれらを使用する方法について、私は悲惨に誤解しています。

誰もがこれにいくつかの光を当てることができますか?

答えて

2

主な違いは、Index APIがあれば、それは、渡されたSQLコンストラクトを介して一般must be defined inline in the table definitionUniqueConstraintおよび制約をテーブルを参照することができるように、テーブル定義の外部指標を定義することができながら、ということである。

ForeignKeyConstraintなどのテーブルレベル制約オブジェクトをDeclarativeを使用して定義されたテーブルに適用するには、Table Configurationで説明されている__table_args__属性を使用します。

理解する事は、明示的な__table__に合格していない場合、宣言クラスの構築時に新しいTableが、構成されていることがあります。あなたのサンプルモデルクラスでは、UniqueConstraintインスタンスはクラス属性にバインドされていますが、宣言ベースには属性から作成されたTableインスタンスの制約は含まれていません。

class MyTable(DeclBase): 
    __tablename__ = 'my_table' 
    ... 
    # A positional argument tuple, passed to Table constructor 
    __table_args__ = (
     UniqueConstraint(attr_2, attr_3, name='my_table_uidx'), 
    ) 

キーワード引数として渡す必要があることに注意してください。テーブルを作成しようとする試みの前に呼び出される場合にも、Table.append_constraint()を使用して制約を渡すことができます。

class MyTable(DeclBase): 
    ... 

MyTable.__table__.append_constraint(
    UniqueConstraint('attr_2', 'attr_3', name='my_table_uidx')) 
+0

偉大な説明を!それは多くの意味があります。 Index( 'my_table_uidx'、attr_2、attr_3、unique = True)の実装に固執することについての議論はありますか?現時点では、以前はMySQL Workbenchで手動でセットアップしたのとまったく同じMySQL定義を生成していたので、私はそれに慣れていく傾向がありました。また、Python側でも読むことができました。 –

+0

MySQLを使用している場合、どちらか一方を好む理由はないと思います。とにかくこれを私に言わせてはいけませんが、ユニークな制約としてユニークなインデックスとして実装されています。ただし、すべてのデータベースで同じことが当てはまるとは限りません。もう一度、私はSQL標準に精通しているわけではありません。 –

+0

十分に公正。それは私の直感でした。そうでないことを示唆しているものがあれば投稿します。ありがとう! –

関連する問題