pandas sqlalchemy将索引添加到现有sqlite3数据库

abithluo  于 2023-01-11  发布在  SQLite
关注(0)|答案(2)|浏览(153)

我建立了一个Pandas数据库:

import numpy as np                                                                                                                                                                                          
import sqlite3                                                                                                                                                                                              
import pandas as pd                                                                                                                                                                                         
import sqlite3                                                                                                                                                                                              
import sqlalchemy                                                                                                                                                                                           
from sqlalchemy import create_engine                                                                                                                                                                        
from sqlalchemy.orm import sessionmaker                                                                                                                                                                     

df = pd.DataFrame(np.random.normal(0, 1, (10, 2)), columns=['A', 'B'])                                                                                                                                      

path = 'sqlite:////home/username/Desktop/example.db'                                                                                                                                                        

engine = create_engine(path, echo=False)                                                                                                                                                                    

df.to_sql('flows', engine, if_exists='append', index=False)                                                                                                                                                 

# This is only to show I am able to read the database                                                                                                                                                                                                            
df_l = pd.read_sql("SELECT * FROM flows WHERE A>0 AND B<0", engine)

现在我想给数据库添加一个或多个索引,在这种情况下,我想首先只为列A创建索引,然后为两个列创建索引。
我该怎么做呢?
如果可能的话,我想一个解决方案,只使用SqlAlchemy,使它独立于数据库的选择。

jchrr9hc

jchrr9hc1#

你应该使用反射来获得Pandas为你创建的table。
关于:
SQLAlchemy Reflecting Database Objects
可以指示表对象从数据库中已存在的相应数据库方案对象加载有关其自身的信息。此过程称为反射。在最简单的情况下,只需指定表名、MetaData对象和autoload=True标志。如果MetaData不是永久绑定的,则还要添加autoload_with参数:
你可以试试这个

meta = sqlalchemy.MetaData()
meta.reflect(bind=engine)
flows = meta.tables['flows']
# alternative of retrieving the table from meta:
#flows = sqlalchemy.Table('flows', meta, autoload=True, autoload_with=engine)

my_index = sqlalchemy.Index('flows_idx', flows.columns.get('A'))
my_index.create(bind=engine)

# lets confirm it is there
inspector = reflection.Inspector.from_engine(engine)
print(inspector.get_indexes('flows'))
rqenqsqc

rqenqsqc2#

这似乎对我有用,你必须自己定义变量psql_URItablecol,这里我假设表名/列名可能是(部分)大写的,但你希望索引名是小写的。
从这里的答案推导出来:https://stackoverflow.com/a/72976667/3406189

import sqlalchemy
from sqlalchemy.orm import Session

engine_psql = sqlalchemy.create_engine(psql_URI)
autocommit_engine = engine_psql.execution_options(isolation_level="AUTOCOMMIT")
with Session(autocommit_engine) as session:
    session.execute(
        f'CREATE INDEX IF NOT EXISTS idx_{table.lower()}_{col.lower()} ON sdi_ai."{table}" ("{col}");'
    )

相关问题