如何使用SQLAlChemy为SQLite3数据库创建索引?

wmomyfyw  于 2022-11-15  发布在  SQLite
关注(0)|答案(1)|浏览(178)

我有多个模型不可用的SQLite3数据库。

def index_db(name, tempdb):
    print(f'{name.ljust(padding)} Indexing file: {tempdb}')

    if tempdb.endswith('primary.sqlite'):
        conn = sqlite3.connect(tempdb)
        conn.execute('CREATE INDEX packageSource ON packages (rpm_sourcerpm)')
        conn.commit()
        conn.close()

如何使用SQLAlChemy执行相同的操作?

vsnjm48y

vsnjm48y1#

我可以想出两种通过SQLAlChemy添加该索引的方法:

  • 如果没有反映,直接执行SQL语句
  • 如果您反映您的表/模型,请向其添加索引

首先,让我们创建要处理的表。

import sqlite3

con = sqlite3.connect("/tmp/73526761.db")
con.execute("CREATE TABLE t73526761 (id INT PRIMARY KEY, name VARCHAR)")
con.commit()
con.close()

然后,无需反射,您就可以使用以下代码执行原始SQL。

import sqlalchemy as sa

engine = sa.create_engine("sqlite:////tmp/73526761.db", future=True)

with engine.begin() as con:
    con.execute(sa.text("CREATE INDEX t73526761_name_idx ON t73526761 (name)"))
    con.commit()

或者,如果您仅Map表(SQLAlChemy核心):

import sqlalchemy as sa

metadata_obj = sa.MetaData()

engine = sa.create_engine("sqlite:////tmp/73526761.db", future=True)

t73526761 = sa.Table("t73526761", metadata_obj, autoload_with=engine)

t73526761_name_idx = sa.Index("t73526761_name_idx", t73526761.c.name)

t73526761_name_idx.create(bind=engine) # emits CREATE INDEX t73526761_name_idx ON t73526761 (name)

或者,如果您反映模型(SQLAlChemy Orm):

import sqlalchemy as sa
from sqlalchemy import orm

Base = orm.declarative_base()

engine = sa.create_engine("sqlite:////tmp/73526761.db", future=True)

class K73526761(Base):
    __table__ = sa.Table("t73526761", Base.metadata, autoload_with=engine)

t73526761_name_idx = sa.Index("t73526761_name_idx", K73526761.name)

t73526761_name_idx.create(bind=engine) # emits CREATE INDEX t73526761_name_idx ON t73526761 (name)

相关问题