Вставка записей в Sqlite с использованием подстановки параметров Python, где некоторые поля пусты - PullRequest
2 голосов
/ 30 июня 2010

Я выполняю такой запрос:

insert into mytable (id, col1, col2)
values (:ID, :COL1, :COL2)

В Python словарь этой формы может использоваться вместе с запросом выше для подстановки параметров:

d = { 'ID' : 0, 'COL1' : 'hi', 'COL2' : 'there' }
cursor.execute(sql_insert, d)

Но в реальной проблеме много столбцов и много строк. Иногда источник данных, который заполняет словарь, не имеет записи. Однако, если словарь короткий, Sqlite будет жаловаться на то, что было предоставлено неверное число привязок, вместо того, чтобы дать мне возможность добавлять пустые строки или NULL в столбцы, которые не заполнены в этом случае.

Я ленивый или немного перфекционист. Я мог бы написать код, чтобы добавить пропущенные поля в словарь. Я просто ищу элегантное решение, которое не требует дублирования списка полей.

Я попытался перегрузить словарь измененным словарем, который возвращает пустую строку, если поле отсутствует.

Ответы [ 3 ]

7 голосов
/ 30 июня 2010

Я не проверял, что это работает, но я думаю, что должно:

from collections import defaultdict
d = { 'ID' : 0, 'COL1' : 'hi' }
cursor.execute(sql_insert, defaultdict(str, d))

defaultdict - это специализированный словарь, в котором любые пропущенные ключи генерируют новое значение вместо броска KeyError.

Конечно, это работает, только если все значения требуют одинакового значения по умолчанию, такого как пустая строка или нет.Если вам нужны разные значения по умолчанию, вам понадобится словарь, содержащий значения по умолчанию, и вы можете сделать:

DEFAULTS = { ... whatever ... }
d = { 'ID' : 0, 'COL1' : 'hi' }
cursor.execute(sql_insert, dict(DEFAULTS).update(d))

Обратите внимание, что вы должны копировать DEFAULTS каждый раз, чтобы вы могли обновить копию с фактическими значениями.*

0 голосов
/ 30 июня 2010

Ограничение DEFAULT указывает значение по умолчанию для использования при выполнении INSERT.Значением может быть NULL, строковая константа, число или константное выражение, заключенное в круглые скобки

в кавычках здесь .

, поэтому используйте CREATEкак это:

CREATE mytable {
    id INTEGER PRIMARY KEY,
    col1 TEXT DEFAULT 'Hello, World!',
    col2 TEXT DEFAULT 'The cake in a lie'
}
0 голосов
/ 30 июня 2010

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

Вы можете построить свой запрос следующим образом (воспользовавшись dict.get возвращает None для пропущенных ключей):

>>> columns = ['id','col1','col2','col_missing']
>>> myData = {'id': 0, 'col1': 'hi', 'col2':'there'}
>>> myQuery = 'insert into mytable (%s) values (%s)' % (",".join(columns),",".join(['%s']*len(columns)))
>>> myArgs = [ myData.get(x) for x in columns ]
>>> myQuery
'insert into mytable (id,col1,col2,col_missing) values (%s,%s,%s,%s)'
>>> myArgs
[0, 'hi', 'there', None]
>>> cursor.execute(myQuery,myArgs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...