1. ホーム
  2. python

[解決済み] sqlalchemy の declarative ORM 拡張機能で複数カラムのインデックスを使用する場合

2022-05-16 14:22:48

質問

によると のドキュメントによると のコメントと sqlalchemy.Column クラスを使用するようにしましょう。 sqlalchemy.schema.Index を使用して、複数のカラムを含むインデックスを指定します。

しかし、例ではこのようにテーブルオブジェクトを直接使って行う方法を示しています。

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)

declarative ORM 拡張を使う場合、どのようにすればよいのでしょうか?

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

私は列 "a" と "b" のインデックスを希望します。

どのように解決するのですか?

これらは単に 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 は通常通りここに存在し、宣言する必要がないだけで、すべてが同じように動作します (宣言的な A.a ラッパーが Column として解釈されます)。

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"), )