2017-09-19 3 views
0

J'ai créé une base de données avec pandas géants:sqlalchemy Ajouter un index à la base de données existante sqlite3

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)                                   

Maintenant, je voudrais ajouter un ou plusieurs index à la base de données. Est-ce que ce cas je voudrais faire d'abord seulement la colonne A et puis les deux indices de colonnes.

Comment puis-je faire cela?

Si possible, je voudrais une solution qui utilise uniquement SqlAlchemy afin qu'elle soit indépendante du choix de la base de données.

+0

Normalement, on pourrait utiliser un outil de migration tels que [alembic] (http: // alembic .zzzcomputing.com/fr/latest /) pour gérer les migrations de base de données, mais vous ne savez pas si cela correspond à votre cas d'utilisation. –

+0

Mon cas d'utilisation est très simple. Toute procédure qui ne nécessite pas trop de travail (temps passé à apprendre un nouvel outil) est bonne. – Donbeo

Répondre

1

Vous devriez utiliser la réflexion pour obtenir la table que les pandas ont créée pour vous.

En ce qui concerne:

SQLAlchemy Reflecting Database Objects

Un objet de table peut être chargé de charger des informations sur lui-même de l'objet du schéma de base de données correspondant existant déjà dans la base de données . Ce processus s'appelle la réflexion. Dans le cas le plus simple , vous devez seulement spécifier le nom de la table, un objet MetaData et le autoload = True flag. Si la métadonnée n'est pas constamment lié, aussi ajouter l'argument autoload_with:

vous pouvez essayer ceci:

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'))