Не удалось вставить элементы списка по чанку в запрос вставки SQLITE из файлов CSV - Python - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь вставить данные по частям из CSV-файлов в папку, но не могу получить правильный запрос вставки SQLITE. Я смог выполнить это без списков, поэтому я знаю, что данные верны. Однако, когда я использую списки, я получаю ошибку: sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 10, and there are 65 supplied. Есть идеи?

import csv, sqlite3, time, os

def chunks(data, rows=10000):
    data = list(data)
    for i in range(0, len(data), rows):
       yield data[i:i+rows]


if __name__ == "__main__":

    datab = 'MYDB'
    con=sqlite3.connect(datab+'.db')
    con.text_factory = str  
    cur = con.cursor()
    koko = 'C:\\MYFOLDER\\'
    print(koko)
    directory = koko 
    print(directory)

    for file in os.listdir(directory):
        for searchfile, csvfile, csvcolumn, tablecolumn, table, valuemark, valcsvcolumn  in zip(['USR02_FINAL.csv'],
                                ['USR02_FINAL.csv'],
                                [['SYS,MANDT, BNAME, GLTGV, GLTGB, USTYP, CLASS, UFLAG, ERDAT, TRDAT']],
                                [['SYS,MANDT, BNAME, GLTGV2, GLTGB2, USTYP, CLASS, UFLAG, ERDAT2, TRDAT2']],                    
                              ['USR_02_ALL_RAW2'],
                              [['?,?,?,?,?,?,?,?,?,?']],
                              [['SYS,MANDT, BNAME, GLTGV, GLTGB, USTYP, CLASS, UFLAG, ERDAT, TRDAT']]):

                        if file.endswith(searchfile):
                                fileinsert = directory + '\\' + csvfile
                                csvData = csv.reader(open(fileinsert, "rt"))

                                divData = chunks(csvData) # divide into 10000 rows each

                                for chunk in divData:
                                    cur.execute('BEGIN TRANSACTION')

                                    for csvcolumn in chunk:

                                        print(searchfile, csvfile, csvcolumn, tablecolumn, table, valuemark, valcsvcolumn)

                                        cur.execute("""INSERT OR IGNORE INTO """ + table +""" ("""+ ', '.join(tablecolumn) +""") VALUES ("""+ ', '.join(valuemark)+""")""",( ', '.join(valcsvcolumn))) 
                                        cur.execute('COMMIT')        

1 Ответ

1 голос
/ 04 марта 2020

Посмотрите на циклы:

for chunk in divData:
  # ...
  for csvcolumn in chunk:
    # ...
    ...join(valcsvcolumn)

Я вижу, что вы используете csvcolumn только в print, но не в операторе вставки; он использует valcsvcolumn, что не связано. Вероятно, это проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...