Как преобразовать команду sqlite в команду python-sqlite [duplicate]

Ответ Майкла Даутермана совершенно прав, как показывает этот скринкаст:

Что вы видите, это контроллер просмотра страницы с несколькими страницами ( пронумерованы так, чтобы вы могли видеть порядок), каждая страница содержит кнопку «Далее», и я неоднократно нажимаю кнопку «Далее», чтобы перейти к следующей странице.

Как и ваш, мой проект, показанный на скриншоте выше , имеет иерархию контроллера представления:

  • UITabBarController
  • ViewController
  • UIPageViewController
  • Страница (которая имеет основной вид и метка и кнопки являются подвидными для этого)

Похоже, что суть вашего вопроса заключается не столько в том, какой метод заставляет контроллер просмотра страницы перейти на следующую или предыдущую страницу - как вы уже сказали, это просто setViewControllers:..., но как кнопка связывается с иерархией контроллера представления. В моем примере это означает отправку сообщения с кнопки внутри представления страницы, мимо контроллера просмотра страницы, мимо UIPageViewController и до ViewController, который затем сообщает UIPageViewController, что делать.

Я могу подумайте о многочисленных способах этого:

  • Кнопка отправляет уведомление, для которого зарегистрирован ViewController
  • Кнопка отправляет действие с нулевым действием, для которого ViewController имеет handler
  • Кнопка отправляет сообщение контроллеру панели вкладок (его свойство tabBarController), которое затем отправляет сообщение вниз в его текущий выбранный контроллер представления, ViewController
  • Кнопка отправляет сообщение в контроллер своего вида (настроен в nib или раскадровке как действие), который отправляет сообщение своему parentViewController!.parentViewController!, который является ViewController.

Что я предпочитаю? Лично мне больше всего нравится ничтожное действие, потому что он не требует лишнего кода. Единственная реализация func pageNextButton() находится в ViewController. Это красота действия nil-target: он поднимает цепочку ответчиков, ищет получателя, автоматически . Контроллер просмотра страницы и UIPageViewController вообще не имеют кода в этом отношении.

Мне нравится это намного лучше, чем parentViewController!.parentViewController!, потому что последнее требует в конечном счете, чтобы контроллер вида страницы знал имя метода в ViewController, который он может вызывать, и он должен сбрасываться на ViewController, который не очень портативен и, по моему мнению, слишком много знает о своей среде. С другой стороны, с помощью ничтожного действия отправитель полностью агностик о том, кем будет реальная цель! Поэтому мне больше всего нравится действие nil-target, а второе - лучшее.

53
задан crystalattice 23 October 2008 в 09:13
поделиться

10 ответов

Модуль sqlite3 поддерживает два вида заполнителей для параметров:

стиль qmark

Используйте один или несколько ?, чтобы отметить положение каждого параметра и предоставить список или кортеж параметров. Например ::

curs.execute("SELECT weight FROM Equipment WHERE name = ? AND price = ?",
             ['lead', 24])

named style

Используйте :par заполнители для каждого именованного параметра и поставьте dict. Например:

curs.execute("SELECT weight FROM Equipment WHERE name = :name AND price = :price",
             {name: 'lead', price: 24})

Преимущества названных параметров стиля - это то, что вам не нужно беспокоиться о порядке параметров, и каждый :par может использоваться несколько раз в больших / сложных SQL-запросах.

123
ответ дан Mike T 17 August 2018 в 19:14
поделиться
123
ответ дан Mike T 6 September 2018 в 12:29
поделиться
123
ответ дан Mike T 29 October 2018 в 18:55
поделиться

Ты пробовал это? :

for item in self.inventory_names:
    t = (item,)
    self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", t)
    self.cursor.close()

cursor.execute () ожидает, что последовательность (список, кортеж) будет вторым параметром. (-> ddaa)

2
ответ дан Blauohr 17 August 2018 в 19:14
поделиться

Аргумент cursor.execute, который представляет значения, которые вам нужно вставить в базу данных, должен быть кортежем (последовательность). Однако рассмотрим этот пример и посмотрим, что происходит:

>>> ('jason')
'jason'

>>> ('jason',)
('jason',)

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

self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", (item,))

Также давая аргументы значения cursor.execute как строки (это то, что вы делаете) приводит к первой оценке в примере и результатам в ошибка, которую вы получаете.

22
ответ дан jgtumusiime 17 August 2018 в 19:14
поделиться
  • 1
    Я думаю, что это должен быть принятый ответ – Kirk 23 May 2013 в 03:08

каждый элемент элементов должен быть кортежем. предполагая, что имена выглядят примерно так:

names = ['Joe', 'Bob', 'Mary']

вы должны сделать следующее:

for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", (item, ))

, используя (item,), вы делаете его кортежем вместо строки.

0
ответ дан Joey Nelson 17 August 2018 в 19:14
поделиться

Цитата (это то, что означают парнеры?)? с парнесом, похоже, работает на меня. Я продолжал пытаться (буквально)? » но я продолжал получать

ProgrammingError: Неправильное количество привязок. Текущий оператор использует 0 и есть 1.

Когда я это сделал:

ВЫБЕРИТЕ факт ОТ ФАКТОИДОВ ГДЕ клавиша LIKE (?)

вместо:

SELECT fact FROM factoids WHERE key LIKE '?'

Это сработало.

Это какая-то вещь python 2.6?

1
ответ дан kjikaqawej 17 August 2018 в 19:14
поделиться
  • 1
    Если вы используете подстановку параметров sqlite3 (вместо интерполяции строк% s Python), то? не следует указывать вообще, т. е. SELECT fact FROM factoids WHERE key LIKE ?. Просто случается, что добавление скобок в SQL не изменяет значения, поэтому SELECT fact FROM factoids WHERE key LIKE (?) эквивалентно без (). – Lie Ryan 3 April 2011 в 18:49
  • 2
    Если вы используете Django, а ваш запрос SELECT fact FROM factoids WHERE key LIKE "%s", вы также захотите избежать кавычек. cursor.execute() не распознает% s как привязку в этом запросе. Поэтому используйте cursor.execute("Select fact FROM factoids WHERE key LIKE %s", (key_name, )) – MrOodles 31 May 2012 в 17:44

Попробуйте

execute("select fact from factoids where key like ?", "%%s%" % val)

Вы вообще ничего не обмениваете вокруг ?, Python sqlite корректно преобразует его в цитируемый объект.

43
ответ дан sth 17 August 2018 в 19:14
поделиться
  • 1
    Вы можете сделать что-то вроде: cursor.execute("SELECT * from %s WHERE name = ?" % table_name, (name,)), хотя это может сделать вашу программу уязвимой для атак SQL-инъекций. – plok 13 October 2011 в 12:15
  • 2
    В ситуациях, когда пользовательский ввод определяет таблицу, я вытаскиваю имя таблицы из dict и создаю исключение, если содержимое ввода является неожиданным. Вероятно, это не лучший способ best , но, как представляется, менее подвержен SQL-инъекции. – James 7 December 2011 в 18:42
  • 3
    @James Мне любопытно, в каких ситуациях вам нужно было изменить, какую таблицу вы вставляете, основываясь на пользовательском вводе? Использование dict звучит как хорошая идея для этой ситуации, я использую их всякий раз, когда я использовал оператор switch. – num1 5 January 2013 в 03:16
  • 4
    @ num1: в любое время вы хотите иметь общий класс, который принимает имя таблицы в качестве параметра init () класса. Таким образом, вы не хотите жестко закодировать имя таблицы, но имеете ли она переменную ... – staggart 2 January 2016 в 21:35
  • 5
    Вы используете [] для имен таблиц, полей и ? для значений, – Pete Cacioppi 2 February 2016 в 03:27
43
ответ дан sth 6 September 2018 в 12:29
поделиться
44
ответ дан sth 29 October 2018 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: