创建表后向SQLAlchemy模型添加索引

2024-04-27 00:40:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个烧瓶炼金术模型:

class MyModel(db.Model):
__tablename__ = 'targets'
id = db.Column(db.Integer, primary_key=True)
url = db.Column(db.String(2048))

表已经创建,并且正在使用中。我想在url属性上创建一个索引,所以我将index=True传递给它:

url = db.Column(db.String(2048), index=True)

如何在不删除和重新创建表的情况下使此索引生效?


Tags: 模型idtrueurldbstringindexmodel
3条回答

给出了模型类的原始问题。

class MyModel(db.Model):
    __tablename__ = 'targets'
    id = db.Column(db.Integer, primary_key=True)
    url = db.Column(db.String(2048))

不能只添加index=True,因为即使调用了db.Model.metadata.create_all(),也不会在已创建的表上创建索引。

相反,您需要创建一个独立的Index对象,然后创建它。它看起来像这样:

class MyModel(db.Model):
    __tablename__ = 'targets'
    id = db.Column(db.Integer, primary_key=True)
    url = db.Column(db.String(2048))

mymodel_url_index = Index('mymodel_url_idx', MyModel.url)

if __name__ == '__main__':
    mymodel_url_index.create(bind=engine)

现在engine的来源取决于您的sqlalchemy配置,但是这段代码应该传达需要发生什么的要点。

如果使用的是Alembic,则可以创建一个迁移来执行此操作,并完全避免将其添加到模型中:

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_index('table1_id', 'table1', ['id'], unique=True)
    op.create_index('table2_id', 'table2', ['id'], unique=True)
    # ### end Alembic commands ###

def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_index('table1_id', table_name='table1')
    op.drop_index('table2_id', table_name='table2')
    # ### end Alembic commands ###

相关问题 更多 >