Можно ли использовать произвольное имя столбца в sqlite3 db? - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь использовать ?, чтобы разрешить мне устанавливать произвольные имена столбцов.

import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute("create table mytab (? text, ? real)", ('v1', 'v2'))

Но я получил следующую ошибку.Так что нельзя использовать ? при создании таблиц?

Traceback (most recent call last):
  File "/tmp/main1.py", line 10, in <module>
    c.execute("create table mytab (? text, ? real)", ('v1', 'v2'))
sqlite3.OperationalError: near "?": syntax error

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Подстановка параметров SQL является инъекцией SQL решения.Он пытается разделить функциональные компоненты (например, ключевое слово SELECT, разделитель операторов ; и т. Д.) И компоненты данных (например, число, строки и т. Д., Которые являются данными, которые совершенно не связаны с функцией SQL)

Смысл параметра в том, чтобы запросить корректный экранирование входных данных, если это необходимо, перед передачей в механизм SQL, чтобы данные оставались данными, а функциональные компоненты были функциональными.

Таким образом, выможет сделать:

SELECT x FROM table_y WHERE z = ?

и передать '""; DROP TABLE table_y' в качестве параметра, и это в точности строка для сопоставления.Но вы не можете сделать:

SELECT x FROM table_y WHERE ? = '""; DROP TABLE table_y'

и передать 'z' в качестве параметра и ожидать, что это будет означать то же самое.Потому что когда вы передаете 'z', оно интерпретируется как строка, а не имя столбца.Имея эту идею, вы увидите, что SQL в вашем примере будет только превращаться в синтаксическую ошибку SQL.

0 голосов
/ 22 марта 2019

попробуйте что-нибудь подобное вместо этого?

"create table mytab ({} text, {} real)".format('v1', 'v2')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...