Вставить данные из MSSQL в SQLite в Python3 - PullRequest
0 голосов
/ 11 мая 2018

Я использую Python 3.6. У меня есть большая таблица в MSSQL, в которой я хочу вытащить данные, обработать их на python и затем сохранить данные. В настоящее время у меня проблемы с возвращаемыми значениями sqlite и pyodbc:

import sqlite3
import pyodbc

tempConn = sqlite3.connect('example.db')
c = tempConn.cursor()
c.execute(
    ''' CREATE TABLE IF NOT EXISTS addresses
    (
         amt NUMERIC,
         city text,
         statecode text,
         zipcode text
    )
    '''
)
conn = pyodbc.connect(
    r'DRIVER={ODBC Driver 11 for SQL Server};'
    r'SERVER=<server>;'
    r'DATABASE=<database>;'
    r'UID=user;'
    r'PWD=password'
)

conn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
conn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
conn.setencoding(encoding='utf-8')

cursor = conn.cursor()

cursor.execute("SELECT TOP 10 fd.Amt, fd.City, fd.StateCode, fd.ZipCode FROM <large table> AS fd")
index = 1
rows = cursor.fetchall()
for row in rows:
    print('Row Data:')
    print(row)
    print('')
    try:
        c.executemany("INSERT INTO addresses VALUES (?,?,?,?)", row)
        rowcount = c.execute("SELECT COUNT(*) FROM addresses")
    except sqlite3.Error as er:
        print('er: ', er.Message)
    print(rowcount)

Ошибка, которую я получаю:

Данные строки: (десятичное число («1000 000»), «Чикаго», «IL», «9999»)

Traceback (последний вызов был последним): файл "dataaccess.py", строка 37, в c.executemany («INSERT INTO address VALUES (?,?,?,?)», строка) ValueError: параметры неподдерживаемого типа

Я полагаю, это потому, что возвращаемый десятичный код pyodbc вставляет "Десятичное число ('')", хотя я не знаю, как это проверить. Как мне вставить эти данные из MSSQL в sqlite в python?

1 Ответ

0 голосов
/ 12 мая 2018

Рассмотрим float() для преобразования Decimal('##'), что требует расширения строки элементов.

for row in rows:
    ...
    c.execute("INSERT INTO addresses VALUES (?,?,?,?)", 
              (float(row[0]), row[1], row[2], row[3]))

Кроме того, executemany в этом контексте будет таким же, как execute, поскольку вы передаете один список, а не список списков / кортежей. Чтобы использовать оператор массовых операций, обойдите цикл for (все еще требующий расширения):

rows = cursor.fetchall()
c.executemany("INSERT INTO addresses VALUES (?,?,?,?)", 
              [(float(row[0]), row[1], row[2], row[3]) for row in rows])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...