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"열에 대한 색인을 원합니다.
그것들은 단지 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
평소처럼 여기에 다시 존재하며 선언 할 필요가 없습니다. 모든 것이 동일하게 작동합니다 (선언적 Aa 래퍼가 Aa로 해석되도록 최근 0.6 또는 0.7에 있는지 확인하십시오. 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"), )
@zzzeek의 답변 을 완료하려면 .
DESC로 복합 색인을 추가하고 ORM 선언적 방법을 사용하려면 다음과 같이 할 수 있습니다.
또한 SQSAlchemy 의 Functional Indexes 문서를 사용하여 mytable.c.somecol
.
from sqlalchemy import Index Index('someindex', mytable.c.somecol.desc())
모델 속성을 사용하고 호출 .desc()
할 수 있습니다.
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class GpsReport(db.Model):
__tablename__ = 'gps_report'
id = db.Column(db.Integer, db.Sequence('gps_report_id_seq'), nullable=False, autoincrement=True, server_default=db.text("nextval('gps_report_id_seq'::regclass)"))
timestamp = db.Column(db.DateTime, nullable=False, primary_key=True)
device_id = db.Column(db.Integer, db.ForeignKey('device.id'), primary_key=True, autoincrement=False)
device = db.relationship("Device", back_populates="gps_reports")
# Indexes
__table_args__ = (
db.Index('gps_report_timestamp_device_id_idx', timestamp.desc(), device_id),
)
If you use Alembic, I'm using Flask-Migrate, it generates something like:
from alembic import op
import sqlalchemy as sa
# Added manually this import
from sqlalchemy.schema import Sequence, CreateSequence
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
# Manually added the Sequence creation
op.execute(CreateSequence(Sequence('gps_report_id_seq')))
op.create_table('gps_report',
sa.Column('id', sa.Integer(), server_default=sa.text("nextval('gps_report_id_seq'::regclass)"), nullable=False),
sa.Column('timestamp', sa.DateTime(), nullable=False))
sa.Column('device_id', sa.Integer(), autoincrement=False, nullable=False),
op.create_index('gps_report_timestamp_device_id_idx', 'gps_report', [sa.text('timestamp DESC'), 'device_id'], unique=False)
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index('gps_report_timestamp_device_id_idx', table_name='gps_report')
op.drop_table('gps_report')
# Manually added the Sequence removal
op.execute(sa.schema.DropSequence(sa.Sequence('gps_report_id_seq')))
# ### end Alembic commands ###
Finally you should have the following table and indexes in your PostgreSQL database:
psql> \d gps_report;
Table "public.gps_report"
Column | Type | Collation | Nullable | Default
-----------------+-----------------------------+-----------+----------+----------------------------------------
id | integer | | not null | nextval('gps_report_id_seq'::regclass)
timestamp | timestamp without time zone | | not null |
device_id | integer | | not null |
Indexes:
"gps_report_pkey" PRIMARY KEY, btree ("timestamp", device_id)
"gps_report_timestamp_device_id_idx" btree ("timestamp" DESC, device_id)
Foreign-key constraints:
"gps_report_device_id_fkey" FOREIGN KEY (device_id) REFERENCES device(id)
'Program Tip' 카테고리의 다른 글
C ++에서 생성자 및 = 연산자 오버로드 복사 : 공통 함수가 가능합니까? (0) | 2020.10.05 |
---|---|
P 요소 안에 중첩 될 수있는 HTML5 요소 목록? (0) | 2020.10.05 |
윤년 버그로부터 보호하기 위해 설계된 코딩 관행을 어떻게 개발할 수 있습니까? (0) | 2020.10.05 |
자바 스크립트에서 부동 소수점 정밀도 다루기 (0) | 2020.10.05 |
Gradle : 둘 이상의 프로젝트 변형 : myLib이 소비자 속성과 일치합니다. (0) | 2020.10.05 |