Вопрос

Существует Java-парадигма для доступа к базе данных, реализованная в 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.

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Да, 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

(обратите внимание, это простая версия, в нашем коде с поддержкой нескольких баз данных у нас есть класс dbconnection, внутри которого есть эта логика.)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top