2013-04-29 3 views
8

Sto provando sqlalchemy e sto usando questa stringa di connessione per il collegamento ai miei databaseSQLAlchemy, la creazione di un database SQLite se non esiste

engine = create_engine('sqlite:///C:\\sqlitedbs\\database.db') 

Fa sqlalchemy creare un database SQLite per voi se uno è non era già presente in una directory doveva recuperare il file di database ?.

risposta

9

Sì, SQLAlchemy fa creare un database per you.I confermato su Windows utilizzando questo codice

from sqlalchemy import create_engine, ForeignKey 
from sqlalchemy import Column, Date, Integer, String 
from sqlalchemy.ext.declarative import declarative_base 

engine = create_engine('sqlite:///C:\\sqlitedbs\\school.db', echo=True) 
Base = declarative_base() 


class School(Base): 

    __tablename__ = "woot" 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 


    def __init__(self, name): 

     self.name = name  


Base.metadata.create_all(engine) 
+1

quindi se il database sqlite è un file esistente in quella directory a cui stai puntando, lo chiamerà invece? Ad esempio: se esiste, connettersi ad esso, altrimenti, crearlo. Ho ragione di dirlo? –

+0

Assolutamente, ho trovato che fosse il caso. – Gandalf

3

ho trovato (usando SQLite + pysqlite) che se la directory esiste, si creerà, ma se la directory non esiste viene generata un'eccezione:

OperationalError: (sqlite3.OperationalError) unable to open database file 

mia soluzione è di fare questo, anche se ci si sente brutto:

if connection_string.startswith('sqlite'): 
     db_file = re.sub("sqlite.*:///", "", connection_string) 
     os.makedirs(os.path.dirname(db_file), exist_ok=True) 
    self.engine = sqlalchemy.create_engine(connection_string) 
+0

A destra, in questo caso probabilmente dovrei semplicemente stampare un messaggio all'utente che dice "Mi dispiace, non posso creare il database FOO perché la BAR di directory non esiste". Quindi, se l'utente vuole crearlo e procedere, possono farlo. –

+0

Per un'app interattiva va bene, ma voglio anche che funzioni in un contesto di integrazione continua – danio

+1

Una volta che le directory esistono, funzionerà in continua integrazione. È necessario decidere se la directory mancante è un errore e richiede l'intervento dell'utente (nel qual caso si genera un messaggio di errore e si rinuncia) o se una directory mancante è solo un avvertimento o un'eccezione minore nel qual caso si crea (probabilmente un'intera catena di) directory e proseguire, che, come dici tu, è 'cattivo'. O lo rendi configurabile ... –