【问题标题】:How to use pyodbc to get results from all odbc compliant databases?如何使用 pyodbc 从所有 odbc 兼容的数据库中获取结果?
【发布时间】:2012-06-21 06:07:07
【问题描述】:

我正在使用 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)

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

【问题讨论】:

    标签: python odbc pyodbc


    【解决方案1】:

    一个问题有很多问题。

    一开始有 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 方言差异。

    【讨论】:

    • 谢谢。实际上选择查询是允许的。我将使用列的描述来获取查询产生的列。
    【解决方案2】:

    正如@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)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      相关资源
      最近更新 更多