python sqlite3 .executemany () с именованными заполнителями? - PullRequest
0 голосов
/ 01 мая 2018

Это работает:

ss = 'insert into images (file_path) values(?);'
dddd = (('dd1',), ('dd2',))
conn.executemany(ss, dddd)

Однако это не так:

s = 'insert into images (file_path) values (:v)'
ddddd = ({':v': 'dd11'}, {':v': 'dd22'})
conn.executemany(s, ddddd)
Traceback (most recent call last):
  File "/Users/Wes/.virtualenvs/ppyy/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 3035, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-31-a999de59f73b>", line 1, in <module>
    conn.executemany(s, ddddd)
ProgrammingError: You did not supply a value for binding 1.

Мне интересно, можно ли использовать именованные параметры с executemany и, если да, то как.

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

Я выписал Выполнение Python sqlite3 с параметрами named и qmark , которое не относится к executemany.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

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

>>> conn.execute('SELECT :v', {':v': 42})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
sqlite3.ProgrammingError: You did not supply a value for binding 1.

Как показано в документации Python , именованные параметры не включают двоеточие:

# And this is the named style:
cur.execute("select * from people where name_last=:who and age=:age", {"who": who, "age": age})

Так что вы должны использовать ddddd = ({'v': 'dd11'}, {'v': 'dd22'}).

0 голосов
/ 01 мая 2018

: не является частью имени параметра.

>>> s = 'insert into images (file_path) values (:v)'
>>> ddddd = ({'v': 'dd11'}, {'v': 'dd22'})
>>> conn.executemany(s, ddddd)
<sqlite3.Cursor object at 0x0000000002C0E500>
>>> conn.execute('select * from images').fetchall()
[(u'dd11',), (u'dd22',)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...