pyodbc-access列名

时间:2013-04-16 19:53:09

标签: pyodbc

我有2个包含150列的表,并尝试连接这些表并逐个获取结果集并处理它们:

qry = '''select a.*, b.*
         from table_a a
              full outer join table_b b
         where a.id = b.id'''
table_row = conn.execute(qry) #execute method yields a generator

现在,我需要访问作为生成器的结果集,并确定table-1&的每一列的值。表2

例如: - 如果表-1和& table-2有一个名为name的列,我需要比较它..

如何通过columnnname访问结果集,即使用Pyodbc,

即resultset.table1.name = resultset.table2.name

1 个答案:

答案 0 :(得分:1)

  1. 使用ISO信息架构视图(我在中使用SQL Server) 例子)返回每个表的列名,替换 适当的数据库和模式参数值。

  2. 将结果列表合并到包含两个表中存在的列名的集合中。

  3. 使用此集合构建一个表示列名的字符串,以便从每个表中进行选择,通过在表名前添加前缀来对每列进行别名。定义列别名将允许您按表区分列。

  4. 执行选择查询和打印值以进行比较。

  5. 代码示例

    # assumes connection, cursor already setup
    # build SQL for retrieving column names
    sql = '''SELECT COLUMN_NAME
             FROM INFORMATION_SCHEMA.COLUMN
             WHERE TABLE_CATALOG = ? AND TABLE_SCHEMA = ?
                   AND TABLE_NAME = ?'''
    
    # get column names from table_a
    rows = cursor.execute(sql, ('database', 'schema', 'table_a')).fetchall()
    table_a_columns = [column[0] for column in rows]
    
    # get column names from table_b
    rows = cursor_b.execute(sql, ('database', 'schema', 'table_b')).fetchall()
    table_b_columns = [column[0] for column in rows]
    
    # get unique matching columns from lists
    matches = set(table_a_columns).intersection(table_b_columns)
    
    # get string of column names to use in query, setting column alias prefixed with
    # table name for each column
    column_alias = 'a.{0} as a_{0}, b.{0} as b_{0}'
    columns = ', '.join([column_alias.format(column) for column in matches])
    sql = 'SELECT {} FROM table_a a FULL OUTER JOIN table_b b ON a.id = b.id'
    sql = sql.format(columns)
    
    # print values to compare
    for row in cursor.execute(sql):
        print row
    

    可能有一种不太复杂的方式,但它让我不知所措。