2017-09-19 1 views
0

Ich habe eine Datenbank mit Pandas erstellt:sqlalchemy Index in den bestehenden sqlite3 Datenbank

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)                                   

Nun möchte ich eine in die Datenbank oder mehrere Indizes hinzufügen. In diesem Fall möchte ich zuerst nur die Spalte A und dann beide Spalten indices machen.

Wie kann ich das tun?

Wenn möglich, möchte ich eine Lösung, die nur SqlAlchemy verwendet, so dass es unabhängig von der Auswahl der Datenbank ist.

+0

Normalerweise würde man ein Migrationstool verwenden, wie zum Beispiel [alembic] (http: // alembic .zzzcomputing.com/de/latest /) mit DB-Migrationen umgehen, aber nicht sicher, wie gut es zu Ihrem Anwendungsfall passt. –

+0

Mein Anwendungsfall ist sehr einfach. Jede Prozedur, die nicht zu viel Arbeit erfordert (Zeitaufwand für das Erlernen eines neuen Werkzeugs) ist gut. – Donbeo

Antwort

1

Sie sollten Reflektion verwenden, um den Tisch zu erhalten, den Pandas für Sie erstellt haben.

Mit Bezug auf:

SQLAlchemy Reflecting Database Objects

Ein Table-Objekt kann angewiesen werden, von das entsprechende Datenbankschema-Objekt bereits innerhalb der Datenbank Informationen über sich selbst zu laden. Dieser Vorgang wird Reflexion genannt. Im einfachsten Fall müssen Sie nur den Tabellennamen, ein MetaData-Objekt und das autoload = True-Flag angeben. Wenn die Metadaten nicht dauerhaft gebunden ist, auch das autoload_with Argument hinzu:

Sie könnte dies versuchen:

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