Ошибка при отображении вывода - Python - SQLite - PullRequest
2 голосов
/ 07 марта 2019

У меня есть набор данных в списке, встроенный в словарь как:

{'list1': ['Freddy', '36', 'fred', '123f', '2017/04/25'], 'Песни2': [ 'Тара', '25', 'mtara', '123t', '2018/03/22']}

Ссылочные обозначения:
{key1: [имя, возраст, псевдоним, идентификатор пользователя, account_created_date],
..key2: [имя, возраст, псевдоним, ИД пользователя, account_created_date]}

Все данные вставляются в переменные в функции Python, по одной для каждой, как описано выше. Когда я вызываю функцию, я сразу получаю вывод как

Выход:
Freddy
Тара

Но когда я пытаюсь вставить данные в базу данных sqlite, я получаю вывод следующим образом:

Выход:
F
R
E
D
D
Y
T
A
R
A

Код:
conn = sqlite3.connect(dbPath)
cur = conn.cursor()
results = cur.executemany("INSERT INTO Field (Field1) VALUES (?)", name)
conn.commit()

Запрос вашей помощи по этому вопросу. Ваша помощь очень ценится. Благодарю вас.

Ответы [ 2 ]

2 голосов
/ 07 марта 2019

Новый ответ

Для более точного соответствия вашему набору данных. Вам нужен список словарей, а не словарь списков, потому что каждый словарь имеет имя столбца в качестве ключа и значение, связанное с этим столбцом (ключом).

names = [{'name': "Freddy"}, {'name': "Joan"}]
results = c.executemany("INSERT INTO names ('name') VALUES (:name)", names)

Остальная часть кода SQLite3 работает, это выводит:

Freddy
Joan

Возможность использовать список кортежей

Вы также можете использовать список кортежей. Если вы не используете словарь, вам нужно убедиться, что каждая строка имеет форму кортежа . Вам нужен каждый из этих кортежей в списке. Вы должны вызвать этот список в функции executemany после запроса SQL.

Основной код:

names = [("Freddy",), ("Joan",)]
results = c.executemany("INSERT INTO names (name) VALUES (?)", names)

Выход:

Freddy
Joan

Поэтому убедитесь, что каждая запись представлена ​​в виде кортежа или словаря. Затем поместите эти кортежи или словари в список. Если это в форме словаря, вы не можете использовать «?» заполнитель. Используйте ': key_name' для каждого заполнителя. (Здесь может быть другой вариант, но я его еще не нашел).

Оригинальный ответ

Я подозреваю, что executemany (...) должен быть выполнен (...). Я давно не использовал SQLite3, поэтому сейчас протестирую его, чтобы убедиться, а затем вернусь к вам.

Обновление 1:

Я помню, что "?" Нужно было отправить в виде кортежа. То есть

cur.executemany("INSERT INTO Field (Field1) VALUES (?)", name)

должно быть не менее

cur.executemany("INSERT INTO Field (Field1) VALUES (?)", (name, ...))

Но я только заставил работать execute () (а не executemany ()), в противном случае он вернулся к той же ошибке. Итак, вот мой рабочий код:

cur.execute("INSERT INTO Field (Field1) VALUES (?)", (name,))

Он дал F, R, E, D, D, Y, потому что читал каждую букву как значения в кортеже. Если бы это было в форме кортежа, это прочитало бы "Фредди" все сразу. Но у меня все еще есть проблемы с executemany (), который, я думаю, работает иначе, чем мы думаем.

Обновление 2:

Вот что я получил на работу. Вам нужно убедиться, что каждая строка имеет форму кортежа . Вам нужен каждый из этих кортежей в списке. Вы должны вызвать этот список в функции executemany после запроса SQL.

Основной код:

names = [("Freddy",), ("Joan",)]
results = c.executemany("INSERT INTO names (name) VALUES (?)", names)

Полный код:

import sqlite3

conn = sqlite3.connect('test.db')
c = conn.cursor()

# Create table
c.execute('''CREATE TABLE IF NOT EXISTS names
             (name text)''')

names = [("Freddy",), ("Joan",)]
results = c.executemany("INSERT INTO names (name) VALUES (?)", names)
conn.commit()

for row in c.execute('SELECT * FROM names'):
    print(row[0])

Это распечатывает:

Freddy
Joan

Обновление 3:

Я обновил его, чтобы он больше подходил для вашего набора данных. Вам нужен список словарей, а не словарь списков, потому что каждый словарь имеет имя столбца в качестве ключа и значение, связанное с этим столбцом (ключом).

Вот еще немного кода, я приступил к работе.

names = [{'name': "Freddy"}, {'name': "Joan"}]
results = c.executemany("INSERT INTO names ('name') VALUES (:name)", names)

С остальным кодом, как это было, он выводит:

Freddy
Joan

(Вдохновленный этим ответом .)

1 голос
/ 07 марта 2019

вы можете изменить

results = cur.executemany("INSERT INTO Field (Field1) VALUES (?)", name)

на

results = cur.executemany("INSERT INTO Field (Field1) VALUES (?)", (name))

, поскольку ожидаемый параметр является кортежем, строка не рассматривается как целое, а разбивается на части

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