سؤال

هناك نموذج Java ل Access قاعدة البيانات المنفذة في Java DataSource. وبعد هذا الكائن إنشاء تجريد مفيد حول إنشاء اتصالات قاعدة البيانات. ال DataSource كائن يحتفظ تكوين قاعدة البيانات، ولكن سيقوم فقط بإنشاء اتصالات قاعدة البيانات عند الطلب. هذا يتيح لك الاحتفاظ بجميع رمز تكوين قاعدة البيانات والتهيئة في مكان واحد، مما يجعل من السهل تغيير تطبيق قاعدة البيانات، أو استخدام قاعدة بيانات وهمية لاختبار.

أعمل حاليا على مشروع بيثون الذي يستخدم CX_ORACLE. في cx_oracle، يحصل المرء على اتصال مباشرة من الوحدة:

import cx_Oracle as dbapi
connection = dbapi.connect(connection_string)
# At this point I am assuming that a real connection has been made to the database.
# Is this true?

أحاول أن أجد موازية DataSource في cx_oracle. يمكنني بسهولة إنشاء ذلك بسهولة عن طريق إنشاء فئة جديدة وتفويل cx_oracle، لكنني كنت أتساءل عما إذا كانت هذه هي الطريقة الصحيحة للقيام بذلك في بيثون.

هل كانت مفيدة؟

المحلول

ستجد المعلومات ذات الصلة من كيفية الوصول إلى قواعد البيانات في Python من خلال النظر في PEP-249: Python قاعدة بيانات API المواصفات V2.0. cx_Oracle يتوافق مع هذه المواصفات، كما تفعل العديد من برامج تشغيل قاعدة البيانات لبثون.

في هذه المواصفات أ Connection يمثل الكائن اتصال قاعدة البيانات، ولكن لا يوجد تجمع مضمن. أدوات مثل sqlalchemy. يمكنك تقديم مرافق تجمع، وعلى الرغم من أن Sqlalchemy غالبا ما يتم إصدار فاتورة كشر، إلا أنه لا يجب استخدامه على هذا النحو ويقدم مجروضات لطيفة للاستخدام في أعلى محركات SQL.

إذا كنت ترغب في القيام بالتعيين العلائقية للكائنات، فإن SQLAlalchemy يقوم العمل، ويمكنك النظر في بناء جملة خاص به أو طبقة أخرى مثل إكسير الذي يجلس فوق Sqlalchemy ويوفر سهولة الاستخدام المتزايد لحالات الاستخدام الأكثر شيوعا.

نصائح أخرى

لا أعتقد أن هناك طريقة "اليمين" للقيام بذلك في Python، باستثناء ربما للذهاب خطوة واحدة وتستخدم طبقة أخرى بين نفسك وقاعدة البيانات.

اعتمادا على سبب الرغبة في استخدام مفهوم DataSource (الذي صادفته فقط في Java)، قد يحل Sqlalchemy (أو شيء مماثل) مشاكلك، دون الحاجة إلى كتابة شيء من الصفر.

إذا لم يناسب ذلك الفاتورة، فقم بكتابة المجمع الخاص بك يبدو وكأنه حل معقول.

نعم، لدى بيثون تجريد مشابه.

هذا من اختبار الانحدار المحلي لدينا، حيث نؤكد أننا نستطيع التحدث مع جميع قواعد البيانات الخاصة بنا كلما بنينا بيثون جديد.

if database == SYBASE:
    import Sybase
    conn = Sybase.connect('sybasetestdb','mh','secret')
elif database == POSTRESQL:
    import pgdb
    conn = pgdb.connect('pgtestdb:mh:secret')
elif database == ORACLE:
    import cx_Oracle
    conn = cx_Oracle.connect("mh/secret@oracletestdb")

curs=conn.cursor()
curs.execute('select a,b from testtable')
for row in curs.fetchall():
    print row

(ملاحظة، هذه هي الإصدار البسيط، في كودنا متعدد الأدوار لدينا فئة DBConnection التي تحتوي على هذا المنطق في الداخل.)

أنا فقط امتصه وكتب بلدي. سمحت لي بإضافة أشياء مثل تجريد قاعدة البيانات (Oracle / MySQL / Access / ETC)، إضافة التسجيل، معالجة الأخطاء مع Rollbacks المعاملات، إلخ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top