Вставьте в столбцы имена с пустым пространством в sqlite3 - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь заполнить базу данных sqlite3 Python3 данными, хранящимися в dict. Проблема в моем коде, кажется, в этом фрагменте.

matchlist=['id','handicap','goal line','corner line']
heads='"'+'","'.join([a for a in list(match.keys()) if a in matchlist])+'"'
llaves=':'+',:'.join([a for a in list(match.keys()) if a in matchlist])

cur.execute('''INSERT or IGNORE INTO preodds ({}) VALUES ({});'''.format(heads,llaves),
            match)

Это дает мне рабочую ошибку рядом со строкой.

Видимо, когда вы пытаетесь вставить в столбцы, имя которых пустопробелы, которые нужно «убежать» от них. Для этого я также изменил свою строку llaves, выполнив следующие действия:

llaves='":'+'",":'.join([a for a in list(match.keys()) if a in matchlist])+'"'

Исправив мою проблему, но вместо того, чтобы заполнять таблицу значением, указанным в моем сообщении, она заполняетсябуквальное значение в строке llaves.

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

1 Ответ

0 голосов
/ 07 октября 2019

Ваш исходный код, вероятно, производит это

INSERT or IGNORE INTO preodds ("id","handicap","goal line","corner line")
 VALUES (:id,:handicap,:goal line,:corner line)

Обратите внимание на пробелы в именах параметров ... имена, начинающиеся с двоеточия (:). Вот в чем проблема.

Ваша попытка - просто передать строковые литералы в виде значений, так что это именно то, что вставлено.

INSERT or IGNORE INTO preodds ("id","handicap","goal line","corner line")
 VALUES (":id",":handicap",":goal line",":corner line")

Кавычки могут использоваться для разграничения имен объектов, но в других контекстах кавычки интерпретируются как литералы строковых значений . Точные правила для определения того, как он интерпретирует указанные значения, найдены здесь .

Насколько я могу судить, параметры не могут быть экранированы и поэтому не могут содержать пробелы или другие специальные символы, по крайней мере, ничего, чтозадокументировано. См. sqlite docs .

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

Что-то вроде:

INSERT or IGNORE INTO preodds ("id","handicap","goal line","corner line")
 VALUES (:id,:handicap,:goalline,:cornerline)

или

INSERT or IGNORE INTO preodds ("id","handicap","goal line","corner line")
 VALUES (?, ?, ?, ?)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...