如何使用pyodbc从所有兼容odbc的数据库中获取结果?

时间:2012-06-19 08:13:54

标签: python odbc pyodbc

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

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

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

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

我做了什么来获取colums标题,即“Name”,“Age”是我从select查询中创建了一个新表然后使用

select column_name from information_schema.columns where table_name=xxx

获取列标题。我不知道查询“创建表格”,“删除表格”和“选择列名称 ....”命令是否全部相同对于符合odbc的数据库。我检查了PostgreSql和MySql,工作正常,但是如果它们不同,那么我需要改变我的实现并且会像:

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

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

2 个答案:

答案 0 :(得分: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则不然,每个数据库都有自己的方言。其中一些是常见的,但有许多不同之处。例如,datetime字符串可能完全不同。

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

答案 1 :(得分:1)

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

要创建将列名和行值放在一起的字典列表(假设已加载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)))