cx_Oracle и парадигма источника данных - PullRequest
3 голосов
/ 19 июля 2009

В Java реализована парадигма доступа к базе данных DataSource. Этот объект создает полезную абстракцию вокруг создания соединений с базой данных. Объект DataSource сохраняет конфигурацию базы данных, но создает подключения к базе данных только по запросу. Это позволяет хранить всю конфигурацию базы данных и код инициализации в одном месте и упрощает изменение реализации базы данных или использование фиктивной базы данных для тестирования.

В настоящее время я работаю над проектом Python, который использует 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.

Ответы [ 4 ]

3 голосов
/ 19 июля 2009

Информацию о том, как получить доступ к базам данных в Python, вы найдете, обратившись к PEP-249: Спецификация API базы данных Python v2.0 . cx_Oracle соответствует этой спецификации, как и многие драйверы баз данных для Python.

В этой спецификации объект Connection представляет соединение с базой данных, но нет встроенного пула. Такие инструменты, как SQLAlchemy , предоставляют средства для пула, и хотя SQLAlchemy часто выставляется как ORM, его не нужно использовать как таковой, и он предлагает хорошие абстракции для использования поверх механизмов SQL.

Если вы хотите сделать объектно-реляционное сопоставление, то SQLAlchemy делает свое дело, и вы можете рассмотреть либо его собственный декларативный синтаксис, либо другой уровень, такой как Elixir , который расположен поверх SQLAlchemy и предоставляет повышенная простота использования для более распространенных случаев использования.

1 голос
/ 19 июля 2009

Я не думаю, что есть "правильный" способ сделать это в Python, кроме, возможно, сделать еще один шаг и использовать другой слой между вами и базой данных.

В зависимости от причины, по которой вы хотите использовать концепцию DataSource (с которой я когда-либо сталкивался только в Java), SQLAlchemy (или что-то подобное) может решить проблемы для вас без необходимости писать что-то с нуля.

Если это не соответствует требованиям, написание собственной обертки звучит как разумное решение.

0 голосов
/ 21 июля 2009

Я просто смирился и написал свой собственный. Это позволило мне добавить такие вещи, как абстрагирование базы данных (Oracle / MySQL / Access / и т. Д.), Добавление журналов, обработка ошибок с откатами транзакций и т. Д.

0 голосов
/ 19 июля 2009

Да, в Python есть похожая абстракция.

Это из нашего локального регрессионного теста сборки, где мы заверяем, что можем общаться со всеми нашими базами данных всякий раз, когда мы собираем новый Python.

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

(обратите внимание, это простая версия, в нашем коде, поддерживающем multidb, у нас есть класс dbconnection, внутри которого есть эта логика.)

...