Преобразование pyodbc.Row в список или кортеж - PullRequest
0 голосов
/ 30 октября 2019

Попытка преобразовать pyodbc.Row в список или кортеж, потому что я пытаюсь добавить данные в таблицу mysql.

Попробовал понимание списка, которое, похоже, не сработало.

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

1 Ответ

0 голосов
/ 31 октября 2019

В понимании списка 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...