2013-02-25 5 views
11

Ich muss ein Skript mit Python Sqlalchemy schreiben, die sucht, ob eine Datenbank existiert, wenn die Datenbank existiert, sollte sie die Datenbank abfragen sonst Datenbank und Tabellen erstellen.Wie suche ich nach der Existenz einer Datenbank mit sqlalchemy

Pseudocode:

if db exists cursor.execute(sql) 
    else 
     create db test; 
     create tables; 
     insert data; 

Antwort

1

einen Motor erstellen, die mit der Datenbank verbunden und führt eine Universal-Abfrage wie SELECT 1;. Wenn dies fehlschlägt, können Sie den DB erstellen. Wie Sie die neue Datenbank erstellen, hängt jedoch vom DBMS ab.

Mit PostgreSQL würden Sie eine Verbindung zur postgres-Datenbank herstellen und eine CREATE DATABASE-Anweisung ausgeben und dann eine Verbindung zur neu erstellten Datenbank herstellen.

+0

ich habe einen Pool von Datenbank bereits in existance so, wenn ich eine Universal-Abfrage erstellen, wird es diese und nicht zu schaffen, die eine will ich holen. Ich hatte gehofft, dass es eine SQL-Syntax gibt, die mysql entspricht, wenn keine Datenbankabfrage existiert. – Herb21

+0

Mit "universal" ich meine es funktioniert auf allen SQL-Datenbanken - ich weiß nicht, welche Backend (s) Sie verwenden. 'create_engine (my_target_dsn) .execute ('select 1')' beeinträchtigt nicht den vorhandenen Pool. –

+0

mein schlechtes ich bekomme dich Ich dachte, aber es schien so klar und einfach Ich dachte nicht, es würde funktionieren. Übrigens benutze ich Python und Sqlalchemy – Herb21

9

Sie können die sqlalchemy.engine.base.Engine.connect() Methode verwenden, die eine OperationalError auslösen wird, wenn die Datenbank nicht existiert.

import sqlalchemy as sqla 
db = sqla.create_engine(database_uri) 
try: 
    db.connect() 
    db.execute(sql) 
except OperationalError: 
    # Switch database component of the uri 
    default_database_uri = os.path.join(os.path.dirname(
          str(db.engine.url)), 'mysql') 
    db = sqla.create_engine(default_database_uri) 
    # Create your missing database/tables/data here 
    # ... 
8

Ein alternativer Weg, wenn es Ihnen nichts ausmacht, andere Bibliotheken zu importieren, ist die Verwendung von sqlalchemy_utils. Dann tut database_exists, was Sie erwarten, die Sie die SQL-Datenbank URI übergeben können.

if database_exists('sqllite:////tmp/test.db'): 
    do_stuff_with_db(db) 

http://sqlalchemy-utils.readthedocs.org/en/latest/database_helpers.html

2

Ich weiß nicht, was der üblicher Weg, aber hier ist ein Weg, um zu überprüfen, ob eine Datenbank durch Abgleich mit der Liste der Datenbanken vorhanden ist.

from sqlalchemy import create_engine 

# This engine just used to query for list of databases 
mysql_engine = create_engine('mysql://{0}:{1}@{2}:{3}'.format(user, pass, host, port)) 

# Query for existing databases 
existing_databases = mysql_engine.execute("SHOW DATABASES;") 
# Results are a list of single item tuples, so unpack each tuple 
existing_databases = [d[0] for d in existing_databases] 

# Create database if not exists 
if database not in existing_databases: 
    mysql_engine.execute("CREATE DATABASE {0}".format(database)) 
    print("Created database {0}".format(database)) 

# Go ahead and use this engine 
db_engine = create_engine('mysql://{0}:{1}@{2}:{3}/{4}'.format(user, pass, host, port, db)) 

Hier ist eine alternative Methode, wenn Sie nicht wissen müssen, ob die Datenbank erstellt wurde oder nicht.

from sqlalchemy import create_engine 

# This engine just used to query for list of databases 
mysql_engine = create_engine('mysql://{0}:{1}@{2}:{3}'.format(user, pass, host, port)) 

# Query for existing databases 
mysql_engine.execute("CREATE DATABASE IF NOT EXISTS {0} ".format(database)) 

# Go ahead and use this engine 
db_engine = create_engine('mysql://{0}:{1}@{2}:{3}/{4}'.format(user, pass, host, port, db)) 
Verwandte Themen