2013-02-25 11 views
11

Potrzebuję napisać skrypt z python sqlalchemy, który wyszukuje, jeśli istnieje baza danych, jeśli baza danych istnieje, powinna wysłać zapytanie do bazy danych, aby utworzyć bazę danych i tabele.jak wyszukać istnienie bazy danych z sqlalchemy

Pseudokod:

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

Odpowiedz

1

Załóż silnik, który łączy się z bazą danych i wykonuje zapytanie uniwersalny jak SELECT 1;. Jeśli się nie powiedzie, możesz utworzyć bazę danych. Sposób tworzenia nowej bazy danych zależy jednak od DBMS.

W PostgreSQL łączysz się z bazą danych postgres i wydajesz instrukcję CREATE DATABASE, a następnie łączysz się z nowo utworzoną bazą danych.

+0

Mam już pulę bazy danych, więc jeśli utworzę uniwersalne zapytanie, wybiorę je i nie utworzę tego, którego chcę. Miałem nadzieję, że istnieje sqlalchemy odpowiednik mysql jeśli nie istnieje utworzyć kwerendę bazy danych. – Herb21

+0

Przez "uniwersalny" mam na myśli, że działa na wszystkich bazach danych SQL - nie wiem, których backendów używasz. 'create_engine (my_target_dsn) .execute ('select 1')' nie będzie kolidować z twoją istniejącą pulą. –

+0

moje złe, że Ci się pomyślałem, ale wydawało się to tak proste i nie myślałem, że to zadziała. przy okazji im przy użyciu Pythona i sqlalchemy – Herb21

9

Można użyć metody sqlalchemy.engine.base.Engine.connect(), która spowoduje zwiększenie wartości OperationalError, jeśli baza danych nie istnieje.

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

Alternatywnym sposobem, jeśli nie masz nic przeciwko importowaniu innych bibliotek, jest użycie sqlalchemy_utils. Następnie database_exists robi to, czego się spodziewasz, dzięki czemu możesz przekazać uri bazę danych sqlalchemy.

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

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

2

nie wiem co kanoniczny sposób jest jednak oto sposób sprawdzić, czy baza danych istnieje, sprawdzając na liście baz danych.

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

Oto alternatywna metoda, jeśli nie trzeba wiedzieć, czy baza danych została utworzona, czy nie.

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)) 
Powiązane problemy