ошибка синтаксиса приложения python flip [duplicate]

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

58
задан FallenAngel 16 October 2015 в 09:22
поделиться

4 ответа

cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))

Обратите внимание, что параметры передаются как кортеж.

API базы данных выполняет правильное экранирование и цитирование переменных. Будьте осторожны, чтобы не использовать оператор форматирования строк (%), потому что

  1. он не выполняет никаких экранов или кавычек.
  2. он подвержен атакам с неконтролируемым строковым форматом например SQL injection .
65
ответ дан Ayman Hourieh 16 August 2018 в 03:40
поделиться
  • 1
    Интересно, почему он работает с vars отдельно, а не в массиве (var1, var2, var3)? – Andomar 23 May 2009 в 21:31
  • 2
    Согласно спецификациям API БД, похоже, что это может быть любым способом: python.org/dev/peps/pep-0249 – Ayman Hourieh 23 May 2009 в 21:57
  • 3
  • 4
    @thekashyap Снова прочитайте внимательно. Что небезопасно, используется оператор форматирования строк %. На самом деле, я так говорю в ответе. – Ayman Hourieh 10 February 2014 в 23:21
  • 5
    мой плохой. Я представил себе % вместо ,, а строка и переменные .. не могут отменить мое голосование по различным причинам. Мне лично хотелось бы видеть слова, такие как небезопасные / атаки и т. д., упомянутые в описание, где вы говорите, не использует % .. – Kashyap 11 February 2014 в 00:28

В разных реализациях Python DB-API разрешено использовать разные заполнители, поэтому вам нужно будет выяснить, какой из них вы используете - это может быть (например, с MySQLdb):

cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))

или (например, с sqlite3 из стандартной библиотеки Python):

cursor.execute("INSERT INTO table VALUES (?, ?, ?)", (var1, var2, var3))

или другие пока (после VALUES у вас могут быть (:1, :2, :3) или «названные стили» (:fee, :fie, :fo) или (%(fee)s, %(fie)s, %(fo)s), где вы передаете dict вместо карты в качестве второго аргумента execute). Проверьте константу строки paramstyle в используемом вами модуле API БД и найдите paramstyle в http://www.python.org/dev/peps/pep-0249/ , чтобы узнать, что все стили прохождения параметров!

45
ответ дан Alex Martelli 16 August 2018 в 03:40
поделиться
  • 1
    Можно ли сделать то же самое, но с внешним SQL-скриптом? – Novitoll 6 December 2016 в 10:11

Много способов. НЕ используйте наиболее очевидный (%s с %) в реальном коде, он открыт для атак .

Здесь copy-paste'd из pydoc sqlite3 :

# Never do this -- insecure!
symbol = 'RHAT'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)

# Do this instead
t = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)
print c.fetchone()

# Larger example that inserts many records at a time
purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
             ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),
             ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
            ]
c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)

Дополнительные примеры, если вам нужно:

# Multiple values single statement/execution
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
print c.fetchall()
c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
print c.fetchall()
# This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
print c.fetchall()
# Insert a single item
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
20
ответ дан Kashyap 16 August 2018 в 03:40
поделиться
  • 1
    Некоторые из реализаций DB-API фактически используют% s для своих переменных - в первую очередь psycopg2 для PostgreSQL. Это не следует путать (хотя это легко) с использованием% s с оператором% для замены строки. Мне было бы очень приятно, если бы для переносимости мы могли просто иметь стандартный стандартный способ указания параметров SQL для DB-API. – ThatAintWorking 24 November 2014 в 19:03

http://www.amk.ca/python/writing/DB-API.html

Будьте осторожны, когда вы просто добавляете значения переменных в свои утверждения: Представьте себе пользователь называет себя ';DROP TABLE Users;' - Вот почему вам нужно использовать sql escaping, который Python предоставляет вам, когда вы используете cursor.execute в приличном режиме. Пример в URL-адресе:

cursor.execute("insert into Attendees values (?, ?, ?)", (name,
seminar, paid) )
16
ответ дан Numlock 16 August 2018 в 03:40
поделиться
  • 1
    Фактически, это не экранирование SQL. Это переменная привязка, которая намного проще и проще. Значения привязаны к оператору SQL после разбора, что делает его невосприимчивым к любой инъекции. – S.Lott 23 May 2009 в 21:34
  • 2
    «Маленькие таблички Бобби, мы называем его». Санируйте свои входы. xkcd.com/327 – mattmc3 26 March 2017 в 19:08
Другие вопросы по тегам:

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