将pyodbc.Row转换为列表或元组

时间:2019-10-30 16:01:02

标签: python pyodbc pymysql

由于我正试图将数据添加到mysql表中,因此试图将pyodbc.Row转换为列表或元组。

尝试了列表理解,但似乎不起作用。

import pymysql
import pymysql.cursors
import pyodbc
import psycopg2
from db_credentials import ...

class ETLOverwrite():

def __init__(self, database, sql_query, to_table):
    self.database = database
    self.sql_query = sql_query
    self.to_table = to_table

def load_to_db(self):
    print('\nStarting upload...\n')

    # CONNECT TO SOURCE DATABASE
    if self.database == '...':
        source_conn = pymysql.connect(**...)
    elif self.database == '...':
        source_conn = pyodbc.connect(**...)
    elif self.database == '...':
        source_conn = psycopg2.connect(**...)

    # EXTRACT SOURCE DATA
    with source_conn.cursor() as source_cursor:
        source_cursor.execute(sql_query)
        field_names = [i[0] for i in source_cursor.description]
        field_names = ', '.join(field_names)
        fetched_data = source_cursor.fetchall()
        data = [rows for rows in fetched_data]


    source_conn.commit()
    source_conn.close()

    from pprint import pprint
    pprint(field_names)
    print('\n')
    pprint(data[:10])
    print('\n')
    print(type(data[0]))
    print('\n')

    # CONNECT TO TARGET DATABASE
    target_conn = pymysql.connect(**..., charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)

    with target_conn.cursor() as target_cursor:
        placeholders = ', '.join(['%s'] * len(data[0]))
        insert_statement = "INSERT INTO %s (%s) VALUES (%s)" % (self.to_table, field_names, placeholders)
        print(insert_statement)
        target_cursor.executemany(insert_statement, data)

    target_conn.commit()
    target_conn.close()


    print('Finished')

期望查看插入到目标数据库表中的所有内容。 相反,我收到以下错误:AttributeError: 'pyodbc.Row' object has no attribute 'translate'

当我尝试使用列表推导将数据从pyodbc.Row转换为列表时,它似乎不起作用。这是最终输出

Starting upload...

'id, currency, commission_amount'


[(4315245, 'GBP', Decimal('1.0000000000')),
 (5235235, 'GBP', Decimal('1.0000000000')),
 (23523523, 'GBP', Decimal('1.0000000000')),
 (53253, 'GBP', Decimal('1.0000000000')),
 (32523, 'GBP', Decimal('1.0000000000')),
 (3456344, 'GBP', Decimal('1.0000000000')),
 (236236, 'GBP', Decimal('1.0000000000')),
 (34634672, 'GBP', Decimal('1.0000000000')),
 (2462346, 'GBP', Decimal('1.0000000000')),
 (2356236, 'GBP', Decimal('1.0000000000'))]


<class 'pyodbc.Row'>


INSERT INTO commissionAmount (booking_id, currency, commission_amount) VALUES (%s, %s, %s)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)

etc etc etc

2 个答案:

答案 0 :(得分:1)

看起来OG已经解决了他自己的问题。但对于像我这样经验不足的人来说,他的回答似乎很神秘。 所以我会像对自己解释一样尝试解释这个问题。

pyodbc中的Row对象好像是tuple、list和dict对象的组合-

  • 像元组一样 - 不能增加或减少长度。
  • Like list - 元素可以通过索引访问并被新值替换
  • 像字典一样 - 可以使用键(列)名称访问元素

    由于列表理解不适用于元组 - 需要按照本页 https://www.pythonpool.com/tuple-comprehension/ 中给出的特殊方式处理它们,我认为它不适用于 Row 对象嗯。

  • 答案 1 :(得分:0)

    在列表理解data = [rows for rows in fetched_data]中,我打算将list(rows)而不只是rows附加到data

        with source_conn.cursor() as source_cursor:
            source_cursor.execute(sql_query)
            field_names = [i[0] for i in source_cursor.description]
            field_names = ', '.join(field_names)
            fetched_data = source_cursor.fetchall()
            data = [list(rows) for rows in fetched_data] # this one