Добавление переменных в бд sqlite
Есть парсер, к нему пытаюсь сделать бд с помощью sqlite3, таблицу создает, но данные в нее не вносит. sqlite3.ProgrammingError: Binding 1 has no name, but you supplied a dictionary (which has only names). - вот такую ошибку он мне пишет. Это мой первый опыт создания бд, не судите строго.) p.s. - перегуглил на столько, что голова кипит.
import sqlite3
connection = sqlite3.connect('hab_data.db')
cursor = connection.cursor()
cursor.executescript("CREATE TABLE if NOT EXISTS hab_data (title TEXT, URL TEXT, USER_NAME TEXT, USER_LINK TEXT, R_DATE TEXT)")
# код парсера
cursor.executemany("INSERT INTO hab_data (title, URL, USER_NAME, USER_LINK, R_DATE) VALUES (?, ?, ?, ?, ?)", (hab))
connection.commit()
connection.close()
Ответы (1 шт):
Есть два варианта как задавать параметры для запроса:
- неименованные параметры
- именованные параметры
Неименованные параметры
В этом случае в запросе нужно использовать знаки вопроса на местах параметров, а значения передавать вторым параметом в execute в виде списка или кортежа. Подстановка будет произведена по порядку, т.е. вместо первого знака вопроса - первый параметр и т.д.:
hab_title = 'some-title'
hab_url = 'http://some.url'
...
cursor.execute(
"INSERT INTO hab_data (title, URL, USER_NAME, USER_LINK, R_DATE) "
"VALUES (?, ?, ?, ?, ?)",
(hab_title, hab_url, user_name, user_link, rdate)
)
тут hab_title, hab_url, и т.п. это переменные которые содержат значения соответствующих полей.
Именованные параметры
В этом случае параметры в запросе задаются на знаками вопроса с помощью синтаксиса, который позволяет задать имя параметра. Второй агрумент execute в этом случае - это dict со значениями параметров.
hab = {
'titiel': 'some-title',
'url': 'http://some.url',
...
}
cursor.execute(
"INSERT INTO hab_data (title, URL, USER_NAME, USER_LINK, R_DATE) "
"VALUES (:title, :url, :username, :userlink, :rdate)",
hab
)
executemany
Если вы используете executemany, то вторым параметром нужно передавать список, каждый элемент которого можно было бы передать в execute.
И те же самые правила, если используете неименованные параметры, то элементом списка должен быть кортеж/список, в котором элементов сколько же, сколько знаков вопроса в тексте запроса.
Если используете неименованные параметры, то элементами должны быть словари.