sqlalchemy の宣言型 ORM 拡張機能を使用する場合の複数列インデックス 質問する

sqlalchemy の宣言型 ORM 拡張機能を使用する場合の複数列インデックス 質問する

によるとドキュメントクラス内のコメントによるとsqlalchemy.Column、クラスを使用してsqlalchemy.schema.Index複数の列を含むインデックスを指定する必要があります。

ただし、この例では、次のように Table オブジェクトを直接使用してこれを行う方法を示しています。

meta = MetaData()
mytable = Table('mytable', meta,
    # an indexed column, with index "ix_mytable_col1"
    Column('col1', Integer, index=True),

    # a uniquely indexed column with index "ix_mytable_col2"
    Column('col2', Integer, index=True, unique=True),

    Column('col3', Integer),
    Column('col4', Integer),

    Column('col5', Integer),
    Column('col6', Integer),
    )

# place an index on col3, col4
Index('idx_col34', mytable.c.col3, mytable.c.col4)

宣言型 ORM 拡張機能を使用する場合、どうすればよいでしょうか?

class A(Base):
    __tablename__ = 'table_A'
    id = Column(Integer, , primary_key=True)
    a = Column(String(32))
    b = Column(String(32))

列「a」と「b」にインデックスを付けたいと思います。

ベストアンサー1

これらは単なるColumnオブジェクトなので、index=True フラグは正常に機能します。

class A(Base):
    __tablename__ = 'table_A'
    id = Column(Integer, primary_key=True)
    a = Column(String(32), index=True)
    b = Column(String(32), index=True)

複合インデックスが必要な場合、Tableここでも通常どおりに が存在します。これを宣言する必要はありません。すべてが同じように動作します (クラスColumn宣言が完了した後に宣言型 Aa ラッパーが として解釈されるように、最新の 0.6 または 0.7 を使用していることを確認してください)。

class A(Base):
    __tablename__ = 'table_A'
    id = Column(Integer, primary_key=True)
    a = Column(String(32))
    b = Column(String(32))

Index('my_index', A.a, A.b)

0.7 ではも引数Indexに含めることができTable、宣言型では で次のようにします__table_args__

class A(Base):
    __tablename__ = 'table_A'
    id = Column(Integer, primary_key=True)
    a = Column(String(32))
    b = Column(String(32))
    __table_args__ = (Index('my_index', "a", "b"), )

おすすめ記事