我正在使用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)
如果上面提到的查询对于所有数据库都是相同的,那么没有问题,但如果它们不同,那么什么是简单有效的解决方案呢?
答案 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)))