При обучении использовать Python sqlite3 я получаю ошибку «sqlite3.OperationalError: 2 значения для 1 столбца» - PullRequest
1 голос
/ 19 июня 2020

Я изучаю python, и у меня есть задание проанализировать каталог для всех типов файлов .txt.

У меня нет проблем с этим, но во второй части требуется, чтобы они были помещены в таблицу в дБ, а затем выведены на консоль с использованием операторов SQL Select. Я застрял на второй части и получаю сообщение об ошибке:

"sqlite3.OperationalError: 2 значения для 1 столбца"

Это то, что у меня так far:

import sqlite3
import os

conn = sqlite3.connect('files.db')

with conn:
    cur = conn.cursor()
    cur.execute('CREATE TABLE IF NOT EXISTS tbl_files( \
                ID INTEGER PRIMARY KEY AUTOINCREMENT, \
                col_files TEXT)')
    conn.commit()
conn.close()

conn = sqlite3.connect('files.db')

with conn:
    cur = conn.cursor()
    file_ = [f for f in os.listdir('/Users/Scott/Desktop/fileList')
                  if f.endswith('.txt')]
    print(file_)
    cur.executemany('INSERT INTO tbl_files(col_files) VALUES (?, ?);', [file_])
    conn.commit()
conn.close()

Это мой первый вопрос по Stack Overflow, и я очень признателен за помощь! Кстати, сейчас я просто использую IDLE, чтобы следить за уроком инструкторов. Я уверен, что выполнение этого в PyCharm даст аналогичные результаты. Дело не в инструменте, а в музыкантах. Еще раз спасибо.

1 Ответ

1 голос
/ 19 июня 2020

У вас есть две проблемы в вашем коде.

  • Во-первых, вы используете два вопросительных знака (?, ?) для одного параметра. Должен быть один.
  • Во-вторых, file_ - это список, а не список кортежей, как должен быть. Это означает, что file_ будет ['file.txt', 'my_file.txt', 'tt.txt', 'word.txt', 'data.txt'] В то время как executemany требует
    [('file.txt',), ('my_file.txt',), ('tt.txt',), ('word.txt',), ('data.txt',)] В документации executemany указано, что он «выполняет команду SQL для всех последовательностей параметров ... найденных в (второй аргумент) ". Это означает, что вторым аргументом executemany должен быть список или списки, список кортежей и т. Д. c.

Правильная строка:

cur.executemany('INSERT INTO tbl_files(col_files) VALUES (?);', [(f,) for f in file_])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...