2013-02-25 11 views
11

के साथ एक डेटाबेस के अस्तित्व के लिए खोज करने के लिए मैं अजगर SQLAlchemy खोज पर कि अगर एक डेटाबेस मौजूद के साथ एक स्क्रिप्ट लिखने की ज़रूरत है, अगर डेटाबेस मौजूद है इसे किसी और डेटाबेस डेटाबेस और टेबल बना क्वेरी चाहिए।कैसे SQLAlchemy

स्यूडोकोड:

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

उत्तर

1

एक इंजन डेटाबेस को जोड़ता है और SELECT 1; की तरह एक सार्वभौमिक क्वेरी निष्पादित करता है कि बनाएँ। यदि यह विफल रहता है, तो आप डीबी बना सकते हैं। नया डेटाबेस कैसे बनाया जाए हालांकि डीबीएमएस पर निर्भर करता है।

PostgreSQL के साथ आप postgres डेटाबेस से कनेक्ट होंगे और CREATE DATABASE कथन जारी करेंगे, फिर नए बनाए गए डेटाबेस से कनेक्ट करें।

+0

मेरे पास पहले से अस्तित्व में डेटाबेस का एक पूल है, इसलिए यदि मैं एक सार्वभौमिक क्वेरी बनाता हूं तो यह उनको उठाएगा और मैं जो चाहता हूं उसे नहीं बनाऊंगा। मैं उम्मीद कर रहा था कि माइस्क्ल के बराबर एक sqlalchemy है यदि डेटाबेस मौजूद नहीं है। – Herb21

+0

तक "सार्वभौमिक" मैं यह सब SQL डेटाबेस पर काम करता है मतलब है - मैं जो बैकएंड (रों) आप उपयोग कर रहे पता नहीं है। 'create_engine (my_target_dsn) .execute ('1 का चयन करें') 'आपके मौजूदा पूल में हस्तक्षेप नहीं करेगा। –

+0

मेरा बुरा मैं तुम्हें मैं कि के बारे में सोचा लेकिन यह इतना सादा और आसान मैं did not यह काम करेगा लगता है लग रहा था मिलता है। जिस तरह से मैं अजगर और sqlalchemy का उपयोग कर रहा हूँ – Herb21

9

आप sqlalchemy.engine.base.Engine.connect() विधि का उपयोग कर सकते हैं, जो डेटाबेस मौजूद नहीं है, तो OperationalError बढ़ाएगा।

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

एक वैकल्पिक तरीका यदि आप अन्य libs आयात करने के लिए कोई आपत्ति नहीं है sqlalchemy_utils उपयोग करने के लिए है। तब database_exists आप क्या उम्मीद है, जो आप SQLAlchemy डेटाबेस uri पास कर सकते हैं करता है।

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

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

2

मैं नहीं जानता कि क्या विहित तरीका यहाँ लेकिन है एक डेटाबेस डेटाबेस की सूची के खिलाफ जाँच करके मौजूद रहने पर देखने के लिए जाँच करने के लिए एक तरीका है।

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

यदि आपको यह पता करने की आवश्यकता नहीं है कि डेटाबेस बनाया गया था या नहीं, तो यह एक वैकल्पिक तरीका है।

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