Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Python, позиционные параметры в виде кортежа  (Прочитано 703 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Gadd

  • Автор темы
  • Участник
  • *
  • Сообщений: 209
    • Просмотр профиля
python3, sqlite3, logging, начинающий питонщик

Есть небольшая проблемка: не знаю, как реализовать передачу параметров в функцию, когда сами параметры находятся в кортеже:
query = "INSERT INTO table VALUES (?,?,?,?,?,?,?,?,?,?,?)"
values = (None, id1, id2, id3, id4, id5, None, id7, None, None, None)
try:
self.cursor.execute(query, values)
except Exception:
logging.exception("Добавление в таблицу: " + query.replace('?','{}').format(values))
В логах должно получиться что-то типа этого:
Добавление в таблицу: INSERT INTO table VALUES (None, id1, id2, id3, id4, id5, None, id7, None, None, None)
Естественно, .format() требует, чтобы параметры ему передавались в виде:
query.replace('?','{}').format(values[0],values[1],....,values[10])Но это как-то громоздко получается. Нет ли более изящного варианта передачи values?

Пользователь решил продолжить мысль 13 Февраля 2014, 00:19:38:
Пока пришел к такому:
query.replace('(?,?,?,?,?,?,?,?,?,?,?)',str(values))В принципе, работает и не нагромождает. Прошу прощения за беспокойство

Пользователь решил продолжить мысль 13 Февраля 2014, 00:25:19:
Но сразу возникает проблема:
query = "UPDATE table SET
         id1 = ?,
         id2 = ?,
         ...
         id10 = ?
         WHERE id_d = ?"
Приведенный выше способ будет так же громоздким. Реквестируруется изящное решение.  :-[
« Последнее редактирование: 13 Февраля 2014, 00:25:19 от Gadd »
Ubuntu 16.04 x86_64
AMD FX X8 8350, Gigabyte 990FXA-UD3 (rev 3.0), GeForce GTX760 2ГБ
Установлены все обновления

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Python, позиционные параметры в виде кортежа
« Ответ #1 : 13 Февраля 2014, 08:36:15 »
#! /usr/bin/env python
# -*- coding: UTF-8 -*-

values = ('a','b','c',0,1,2,3)
query = '''INSERT INTO table VALUES %(par)s''' %{"par":values}
print query


Оффлайн Gadd

  • Автор темы
  • Участник
  • *
  • Сообщений: 209
    • Просмотр профиля
Re: Python, позиционные параметры в виде кортежа
« Ответ #2 : 13 Февраля 2014, 10:51:03 »
Дело в том, что для такого запроса я решил проблему (см. выше)
А вот когда в sql-запросе знаки "?" находятся вперемешку со значащими элементами запроса - тут возникают проблемы
query = "UPDATE table SET
         id1 = ?,
         id2 = ?,
         ...
         id10 = ?
         WHERE id_d = ?"
Нужно заменить все "?" на соответствующие им значения из кортежа value для контроля запроса в случае исключения.

Один из вариантов, что мне пришёл в голову - последовательно проходить value и по одному заменять "?". Типа следующего:
>>> string='1?23?45?6?78'
>>> val = 'a','b','c','d'
>>> for i in val:
...  string = string.replace('?', i, 1)
...
>>> string
'1a23b45c6d78'

Второй вариант - рядом записать запрос и список параметров. Типа этого:
logging.exception("Добавление в таблицу:" + query + str(values)). Так, может быть, даже проще будет. Хотя и не так наглядно

Пользователь решил продолжить мысль 13 Февраля 2014, 10:53:19:
Было бы еще проще, если бы sqlite умел выдавать результирующий запрос для контроля, но я так и не нашел, можно ли это получить в принципе  :-\
« Последнее редактирование: 13 Февраля 2014, 10:53:19 от Gadd »
Ubuntu 16.04 x86_64
AMD FX X8 8350, Gigabyte 990FXA-UD3 (rev 3.0), GeForce GTX760 2ГБ
Установлены все обновления

 

Страница сгенерирована за 0.055 секунд. Запросов: 25.