Как напрямую запросить реляционную базу данных / SQL из продукта ZOPE? - PullRequest
1 голос
/ 02 марта 2011

Как подключиться и запросить реляционную базу данных, которая была настроена с DA, например, ZPsycopgDA в продукте Zope?

Я хочу отправлять свои собственные запросы SQL с использованием связанных параметров и получать результаты, предпочтительныенабор объектов Result.

Я не хочу использовать ZSQLMethods, так как не могу заранее создать его для каждого запроса, а ZSQLMethods не поддерживает связанные параметры.

Ответы [ 2 ]

4 голосов
/ 02 марта 2011

База кода Zope Database Adapters (DA) является одним из старейших кодов, все еще используемых в Zope, и, таким образом, несколько архаична.Когда вы вызываете Zope DA, вы получаете объект соединения с базой данных (экземпляр БД), который, в свою очередь, имеет метод запроса:

connection = context.idOfZPsycoPGDA()
connection.query('SELECT * FROM your_table')

Метод запроса не совсем стандартный метод API базы данных Python.Он принимает несколько операторов SQL, разделенных \0 нулевыми символами, но не поддерживает SELECT, если существует более одного оператора.

Метод запроса ZPsychoDA также принимает параметры запроса:

connection.query('SELECT * FROM your_table WHERE id=?', ('yourid',))

но что более важно, адаптер ZPsychoDA также дает вам доступ к обычному курсору базы данных:

c = connection.cursor()
c.query('SELECT * FROM your_table WHERE id=?', ('yourid',))

Мой совет - просто используйте это и выполняйте обычные вызовы Python DB API через курсор базы данных, который вы там получаете.1013 *

1 голос
/ 02 марта 2011

Экземпляры соединителя базы данных должны предоставлять метод query (), принимающий команду SQL. И вы получаете доступ к экземпляру адаптера базы данных путем получения (или обхода черезTraderTraverse ('/ path / to / da'):

result = context.my_zpyscopgda.query("select * from foo")

result = context.restrictedTraverse('/path/to/my_zpyscopgda').query("select * from foo")
...