1

我正在使用 pyodbc 连接到各种兼容 odbc 的数据库。

假设一个 MySql 数据库中有名字、年龄、国籍。现在我的要求是我必须生成一个包含其中记录的字典,例如:

{'Name' : 'a', 'Age' : '20'} 

如果在 pyodbc 对象的 execute() 方法中指定了查询。

我为获取列标题(即“姓名”、“年龄”)所做的是我从选择查询中创建了一个新表,然后使用

select column_name from information_schema.columns where table_name=xxx

获取列标题。我不知道查询“ create table ”、“ drop table ”和“ select column name ....”命令对于 odbc 兼容数据库是否都相同。我检查了 PostgreSql 和 MySql,工作正常,但如果它们不同,那么我需要更改我的实现,就像:

if mysql:
    execute(this)
if posegresql:
    execute(this)
if ibmdb2:
    execute(this)

如果我上面提到的查询对于所有数据库都是相同的,那么就没有问题,但是如果它们不同,那么简单有效的解决方案是什么?

4

2 回答 2

2

一个问题有很多问题。

起初有 DB-API 标准化一些东西,其中之一是description你得到的列SELECT。你不应该使用information_schema这些东西。如果您使用其他表中的列或仅显示,您将显示COUNT(*)什么?这是如何使用description获取列名(尝试使用pyodbc和 Northwind MS Access 数据库):

rs = c.execute("SELECT * FROM Categories")
cols = [d[0] for d in rs.description]
print(cols)
for rs in c.fetchall():
    print(rs)

至于 SQL 则不,每个数据库都有自己的方言。其中一些是常见的,但也有很多不同之处。例如,日期时间字符串可能完全不同。

当然,您可以通过 DAL 使用数据库:https ://en.wikipedia.org/wiki/Database_abstraction_layer ,但我只使用了来自 web2py 的 DAL。如果您想构建更大且独立于数据库的东西,我认为使用这种现有的 DAL 是最简单的想法。ODBC 和 JDBC 等类似标准只是连接数据库、执行某些查询或执行其他语句、检查元数据(列名等)的方法,但它们不会隐藏 SQL 方言差异。

于 2012-06-19T09:29:36.190 回答
1

正如@Michał Niklas 所说,游标的描述变量是检索列元数据的最佳方式。

要创建将列名和行值放在一起的字典列表(假设pyodbc已加载,已建立数据库连接,并且光标为c):

rs = c.execute("SELECT * FROM Categories")
cols = [d[0] for d in rs.description]
results = []
for row in c.fetchall():
    results.append(dict(zip(cols,row)))
于 2012-06-20T14:16:11.717 回答