Gemäß der Dokumentation und den Kommentaren in der sqlalchemy.Column
Klasse sollten wir die Klasse verwenden sqlalchemy.schema.Index
, um einen Index anzugeben, der mehrere Spalten enthält.
Das Beispiel zeigt jedoch, wie dies direkt mit dem Table-Objekt geschieht:
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)
Wie sollen wir es machen, wenn wir die deklarative ORM-Erweiterung verwenden?
class A(Base):
__tablename__ = 'table_A'
id = Column(Integer, , primary_key=True)
a = Column(String(32))
b = Column(String(32))
Ich möchte einen Index für die Spalten "a" und "b".
Antworten:
das sind nur
Column
Objekte, index = True Flag funktioniert normal:Wenn Sie einen zusammengesetzten Index möchten, der
Table
hier wie gewohnt wieder vorhanden ist, müssen Sie ihn einfach nicht deklarieren. Alles funktioniert gleich (stellen Sie sicher, dass Sie den aktuellen Wert von 0,6 oder 0,7 haben, damit der deklarative Aa-Wrapper als interpretiert wirdColumn
nach Abschluss der Klassendeklaration):In 0.7
Index
kann das auch in denTable
Argumenten sein, was mit deklarativ via ist__table_args__
:quelle
Um die Antwort von @ zzzeek zu vervollständigen .
Wenn Sie mit DESC einen zusammengesetzten Index hinzufügen und die deklarative ORM-Methode verwenden möchten, können Sie wie folgt vorgehen.
Außerdem hatte ich Probleme mit der Dokumentation der Funktionsindizes von SQSAlchemy und versuchte herauszufinden, wie ich sie ersetzen kann
mytable.c.somecol
.Wir können einfach die Modelleigenschaft verwenden und sie aufrufen
.desc()
:Wenn Sie Alembic verwenden, verwende ich Flask-Migrate. Es generiert Folgendes:
Schließlich sollten Sie die folgende Tabelle und Indizes in Ihrer PostgreSQL-Datenbank haben:
quelle