এসকিউএএলএলকেমি ব্যবহার করে কীভাবে একটি নতুন ডাটাবেস তৈরি করবেন?


103

এসকিউএএলএলচেমি ব্যবহার করে একটি ইঞ্জিন অবজেক্ট তৈরি করা হয়েছে:

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

অ্যাক্সেস engineব্যর্থ হয় যদি create_engine(এই ক্ষেত্রে mydb) আর্গুমেন্টে নির্দিষ্ট ডেটাবেস উপস্থিত না থাকে। নির্দিষ্ট ডাটাবেসটি উপস্থিত না থাকলে কি এসকিউএলএলচেমিকে নতুন ডাটাবেস তৈরি করতে বলা সম্ভব?


2
একটি নতুন ডাটাবেস তৈরি বা কেবল টেবিল? আমি এমন অনেকগুলি ORM জুড়ে আসিনি যা আসলে ডেটাবেস তৈরি করে।
নওফাল ইব্রাহিম

4
আমি খুঁজে করেনি এই
Noufal ইব্রাহিম

উত্তর:


97

পোস্টগ্রিতে, তিনটি ডাটাবেস সাধারণত ডিফল্টরূপে উপস্থিত থাকে। আপনি যদি কোনও সুপারসুজার (যেমন, postgresভূমিকা) হিসাবে সংযোগ করতে সক্ষম হন তবে আপনি postgresবা template1ডাটাবেসের সাথে সংযোগ করতে পারেন । ডিফল্ট pg_hba.conf ভূমিকাটি postgresব্যবহার করার জন্য নামমাত্র ইউনিক্স ব্যবহারকারীকে অনুমতি দেয় postgres, তাই সবচেয়ে সহজ জিনিসটি কেবল সেই ব্যবহারকারী হয়ে ওঠে। যে কোনও হারে, কোনও ব্যবহারকারীর সাথে যথারীতি একটি ইঞ্জিন তৈরি করুন যার ডেটাবেস তৈরির অনুমতি রয়েছে:

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

আপনি engine.execute()তবে ব্যবহার করতে পারবেন না , কারণ পোস্টগ্র্যাসগুলি আপনাকে লেনদেনের অভ্যন্তরে ডাটাবেস তৈরি করতে দেয় না এবং স্ক্যালচেমি সর্বদা লেনদেনে অনুসন্ধান চালানোর চেষ্টা করে। এটি পেতে, ইঞ্জিন থেকে অন্তর্নিহিত সংযোগটি পান:

>>> conn = engine.connect()

তবে সংযোগটি এখনও কোনও লেনদেনের অভ্যন্তরে থাকবে, সুতরাং আপনার সাথে খোলা লেনদেনটি শেষ করতে হবে commit:

>>> conn.execute("commit")

এবং তারপরে আপনি সঠিক পোস্টগ্রাইএসকিউএল কমান্ড ব্যবহার করে ডাটাবেস তৈরি করতে এগিয়ে যেতে পারেন।

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

3
এটি আমার পক্ষে ভাল কাজ করেছে। পার্শ্ব দ্রষ্টব্য হিসাবে, যখন আমি conn.execute('drop database DBWithCaps')এটির সাথে ক্যাপগুলি স্বীকৃতি না দেওয়ার ক্ষেত্রে সমস্যা ছিল। conn.execute('drop database "DBWithCaps"')(উদ্ধৃতি সহ) ভাল কাজ করে।
কোবেজহান

আমি জানি পোস্টগ্র্রেএসকিউএল উদ্ধৃত না হওয়াতে সমস্ত সত্তা লোয়ার ক্ষেত্রে প্রত্যাশা করে। সুতরাং আপনি যদি মাই কলামটি ব্যবহার করে কোনও ক্ষেত্র তৈরি করেন তবে কিছু ডিবি এটি মাইকোলোম হিসাবে গ্রহণ করবে। অন্য কথায়, না নিশ্চিত কিভাবে আপনি আপনার টেবিল নির্মিত, কিন্তু যদি এটা কোট ব্যবহার করে তৈরি করা হয়েছিল, এটা হবে কেস সংবেদনশীল, তাই যখন আপনি একটি SQL বিবৃতিতে এটি অ্যাক্সেস ভাল হিসাবে আপনি কোট করতে হবে।
গায়ারাড

119

এসকিউএএলএলকেমি-ইউটিলেস এসকিউএএলএলচেমির জন্য কাস্টম ডেটা প্রকার এবং বিভিন্ন ইউটিলিটি ফাংশন সরবরাহ করে। আপনি পাইপ ব্যবহার করে অতি সাম্প্রতিক অফিসিয়াল সংস্করণ ইনস্টল করতে পারেন:

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"
গুউস

স্প্যামের জন্য দুঃখিত, তবে আমি পোর্টটি 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

দেখে মনে হচ্ছে আপনি কোনও ডেটাবেস নির্দিষ্ট না করে প্রগ্রেস সার্ভারের সাথে সংযোগ স্থাপন করতে পারবেন না, তাই আপনি সম্ভবত ডিবি তৈরির আদেশগুলি কার্যকর করতে ডিফল্ট "পোস্টগ্রিজ" ডাটাবেসের সাথে সংযোগ করতে চান, অন্যথায় এটি ডিফল্ট "ব্যবহারকারীর সাথে সংযোগ স্থাপনের চেষ্টা করবে" "ডাটাবেস এবং এটি উপস্থিত না থাকলে অভিযোগ।
ওক গাছের ফল

0

দয়া করে নোট করুন যে আমি উপরের পরামর্শগুলি সাথে পেতে পারি না database_existsকারণ যখনই আমি database_exists(engine.url):এই ত্রুটিটি পাই না তবে ডেটাবেস ব্যবহার করে উপস্থিত রয়েছে কিনা তা যাচাই করি:

ইন্টারফেসেররার ('(পাইডবিসি.ইনটারফেসআর্রার)' (\ '28000 \', আপনি ['[28000] [মাইক্রোসফ্ট] [এসকিউএল সার্ভার নেটিভ ক্লায়েন্ট 11.0] [এসকিউএল সার্ভার] লগইন ব্যবহারকারী my' মাইউজার \\ 'এর জন্য ব্যর্থ হয়েছে। (18456) (এসকিউএলড্রাইভার সংযোগ); [২৮০০০] [মাইক্রোসফ্ট] [এসকিউএল সার্ভার নেটিভ ক্লায়েন্ট ১১.০] [এসকিউএল সার্ভার] লগইন দ্বারা অনুরোধ করা "MY_DATABASE" ডাটাবেসটি খুলতে পারে না The লগইন ব্যর্থ হয়েছে ( ক্লায়েন্ট ১১.০] [এসকিউএল সার্ভার] ব্যবহারকারী my 'মাইউজার \\' এর জন্য লগইন ব্যর্থ হয়েছে। (18456); [২৮০০০] [মাইক্রোসফ্ট] [এসকিউএল সার্ভার নেটিভ ক্লায়েন্ট ১১.০] [এসকিউএল সার্ভার] লগইন দ্বারা অনুরোধ করা "MY_DATABASE" ডাটাবেস খুলতে পারে না । লগইন ব্যর্থ হয়েছে। (4060) \ ')',)

এছাড়াও contextlib/suppressকাজ করছে না এবং আমি ব্যবহার করছি না postgresতাই ডাটাবেসটি এসকিউএল সার্ভারের সাথে ইতিমধ্যে উপস্থিত থাকলে এটি ব্যতিক্রম উপেক্ষা করার জন্য আমি এই কাজটি শেষ করেছি:

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))  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.