SQLAlchemy का उपयोग करके एक नया डेटाबेस कैसे बनाएं?


103

SQLAlchemy का उपयोग करते हुए, एक इंजन ऑब्जेक्ट इस तरह बनाया जाता है:

from sqlalchemy import create_engine
engine = create_engine("postgresql://localhost/mydb")

एक्सेस करना engineविफल रहता है डेटाबेस के लिए तर्क में निर्दिष्ट create_engine(इस मामले में, mydb) मौजूद नहीं है। यदि निर्दिष्ट डेटाबेस मौजूद नहीं है, तो क्या SQLAlchemy को एक नया डेटाबेस बनाना संभव है?


2
एक नया डेटाबेस या सिर्फ टेबल बनाएं? मैं कई ओआरएम में नहीं आया हूं जो वास्तव में डेटाबेस बनाते हैं।
नौफल इब्राहिम

4
मैं मिला इस
Noufal इब्राहिम

जवाबों:


97

पोस्टग्रेज पर, तीन डेटाबेस सामान्य रूप से डिफ़ॉल्ट रूप से मौजूद होते हैं। यदि आप एक सुपरयूज़र (जैसे, postgresभूमिका) के रूप में कनेक्ट करने में सक्षम हैं , तो आप postgresया template1डेटाबेस से कनेक्ट कर सकते हैं । डिफ़ॉल्ट pg_hba.conf केवल यूनिक्स उपयोगकर्ता postgresको postgresभूमिका का उपयोग करने के लिए नामित करता है , इसलिए सबसे सरल बात यह है कि वह उपयोगकर्ता बन जाए। किसी भी दर पर, एक उपयोगकर्ता की तरह एक इंजन बनाएं जिसमें डेटाबेस बनाने की अनुमति हो:

>>> engine = sqlalchemy.create_engine("postgres://postgres@/postgres")

engine.execute()हालाँकि आप इसका उपयोग नहीं कर सकते , क्योंकि पोस्टग्रेज आपको लेन-देन के अंदर डेटाबेस बनाने की अनुमति नहीं देता है, और sqlalchemy हमेशा लेनदेन में प्रश्नों को चलाने की कोशिश करता है। इसके आसपास जाने के लिए, इंजन से अंतर्निहित कनेक्शन प्राप्त करें:

>>> conn = engine.connect()

लेकिन कनेक्शन अभी भी एक लेनदेन के अंदर होगा, इसलिए आपको खुले लेनदेन को समाप्त करना होगा commit:

>>> conn.execute("commit")

और फिर आप इसके लिए उचित PostgreSQL कमांड का उपयोग करके डेटाबेस बनाने के लिए आगे बढ़ सकते हैं।

>>> conn.execute("create database test")
>>> conn.close()

3
इसने मेरे लिए अच्छा काम किया। एक साइड नोट के रूप में, जब मैंने किया था तो conn.execute('drop database DBWithCaps')मुझे कैप को पहचानने में समस्या नहीं हुई। conn.execute('drop database "DBWithCaps"')(उद्धरण के साथ) ठीक काम किया।
कोबे जॉन

मुझे पता है कि PostgreSQL कम मामले में सभी संस्थाओं की अपेक्षा करता है, जब तक कि उद्धृत नहीं किया जाता है। इसलिए यदि आपने MyColumn का उपयोग करके एक क्षेत्र बनाया है तो कुछ DBs इसे mycolumn के रूप में लेंगे। दूसरे शब्दों में, निश्चित नहीं है कि आपने अपनी तालिका कैसे बनाई है, लेकिन यदि यह उद्धरणों का उपयोग करके बनाई गई है, तो यह केस-संवेदी होगा, इसलिए जब आप इसे SQL कथन में एक्सेस करते हैं तो आपको उद्धरणों की भी आवश्यकता होगी।
मसराद

119

SQLAlchemy-Utils SQLAlchemy के लिए कस्टम डेटा प्रकार और विभिन्न उपयोगिता फ़ंक्शंस प्रदान करता है। आप पाइप का उपयोग करके सबसे हाल का आधिकारिक संस्करण स्थापित कर सकते हैं:

pip install sqlalchemy-utils

डेटाबेस सहायकों एक शामिल create_databaseसमारोह:

from sqlalchemy import create_engine
from sqlalchemy_utils import database_exists, create_database

engine = create_engine("postgres://localhost/mydb")
if not database_exists(engine.url):
    create_database(engine.url)

print(database_exists(engine.url))

2
यह सटीक कोडब्लॉक आज़माते समय मुझे यह त्रुटि मिली psycopg2.OperationalError: fe_sendauth: no password supplied:। जब "postgres://test:abc123@localhost:5432/test"मैं उपयोग कर रहा हूँpsycopg2.OperationalError: FATAL: password authentication failed for user "test"
Guus

स्पैम के लिए क्षमा करें, लेकिन मैंने बंदरगाह को 9000 में बदलने की कोशिश की और अब मुझे यह मिल गया है:"postgres://test:abc123@localhost:9000/test" psycopg2.OperationalError: server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
गूस

9

यह पुस्तिका लेनदेन प्रबंधन से बचने के लिए उपलब्ध कराने के द्वारा डेटाबेस बनाने के दौरान संभव है isolation_level='AUTOCOMMIT'करने के लिए create_engineसमारोह:

import sqlalchemy

with sqlalchemy.create_engine(
    'postgresql:///postgres',
    isolation_level='AUTOCOMMIT'
).connect() as connection:
    connection.execute('CREATE DATABASE my_database')

यदि आप सुनिश्चित नहीं हैं कि डेटाबेस मौजूद नहीं है, तो sqlalchemy.exc.ProgrammingErrorअपवाद को दबाकर अस्तित्व के कारण डेटाबेस निर्माण त्रुटि को अनदेखा करने का एक तरीका है:

import contextlib
import sqlalchemy.exc

with contextlib.suppress(sqlalchemy.exc.ProgrammingError):
    # creating database as above

ऐसा लगता है कि आप किसी डेटाबेस को निर्दिष्ट किए बिना किसी progres सर्वर से कनेक्ट नहीं कर सकते हैं, इसलिए आप शायद db निर्माण कमांड को निष्पादित करने के लिए डिफ़ॉल्ट "पोस्टग्रेज" डेटाबेस से कनेक्ट करना चाहते हैं, अन्यथा यह डिफ़ॉल्ट से कनेक्ट करने का प्रयास करेगा "उपयोगकर्ता "डेटाबेस और शिकायत अगर यह मौजूद नहीं है।
शाहबलूतिक

0

कृपया ध्यान दें कि मुझे उपरोक्त सुझाव नहीं मिल सकते database_existsक्योंकि जब भी मैं जाँचता हूँ कि क्या डेटाबेस में मौजूद है अगर database_exists(engine.url):मुझे यह त्रुटि नहीं मिलती है:

InterfaceError ('pyodbc.InterfaceError) (\' 28000 \ ', u \' [28000] [Microsoft] [SQL सर्वर नेटिव क्लाइंट 11.0] [SQL सर्वर] उपयोगकर्ता के लिए विफल \\ 'myUser \\' (18456) (SQLDriverConnect); [28000] [Microsoft] [SQL सर्वर नेटिव क्लाइंट 11.0] [SQL सर्वर] लॉगिन द्वारा अनुरोधित डेटाबेस "MY_DATABASE" नहीं खोल सकता। लॉगिन विफल रहा। (4060); [28000] [Microsoft] [SQL सर्वर नेटिव क्लाइंट 11.0] [SQL सर्वर] उपयोगकर्ता \\ 'myUser \\' (18456) के लिए लॉग इन विफल रहा। । लॉगिन फेल हो गया। (4060) \ ')',)

यह भी contextlib/suppressकाम नहीं कर रहा था और मैं उपयोग नहीं कर रहा हूं postgresइसलिए मैंने अपवाद को अनदेखा करने के लिए ऐसा किया यदि डेटाबेस SQL ​​सर्वर के साथ पहले से मौजूद होता है:

import logging
import sqlalchemy

logging.basicConfig(filename='app.log', format='%(asctime)s-%(levelname)s-%(message)s', level=logging.DEBUG)
engine = create_engine('mssql+pyodbc://myUser:mypwd@localhost:1234/MY_DATABASE?driver=SQL+Server+Native+Client+11.0?trusted_connection=yes', isolation_level = "AUTOCOMMIT")

try: 
    engine.execute('CREATE DATABASE ' + a_database_name)
except Exception as db_exc:
    logging.exception("Exception creating database: " + str(db_exc))  
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.