Код из вашего примера не скомпилирован, то есть он недействителен python. cursor.execute()
принимает строку и необязательный набор аргументов, которые разворачиваются в строку в соответствии с модулем базы данных paramstyle
.
Фактически, при использовании DBAPI
ваша проблема даже не возникает, поскольку синтаксис SQL и синтаксис python полностью разделены.
Если вы используете psycopg2
для доступа к PostgreSQL, paramstyle
является pyformat
, следовательно,
cursor.execute(
'INSERT INTO measurements (file_size) VALUES (%(file_size)s);',
file_size=file_size # pass variable file_size as named parameter file_size
);
Как вы можете видеть, вы задаете запрос SQL и оставить заполнители для значений, которые вы хотите передать из питона кода ,
Если paramstyle == 'pyformat'
, также можно использовать позиционные параметры:
cursor.execute(
'INSERT INTO measurements (file_size) VALUES (%s);',
file_size # pass variable file_size as positional parameter
);
Обратите внимание, что различные модули доступа к базе данных реализовать различные paramstyle
«S и нужны различные заполнители параметров (или подходящую оболочку).
Предполагается, что все реализации подстановки параметров должным образом исключают свои аргументы в соответствии с правилами бэкэнд базы данных, что является хорошей и важной функцией, так как вам не нужно вручную удалять ваши данные.
Я использую 'psycopg2'. Какой стиль используется по умолчанию в 'psycopg2'? Последний стиль легче читать, чем первый. Однако, если есть autoescape только в первом, то это должно быть лучше. –
'psycopg2' принимает оба (например, он правильно реализует' paramstyle == pyformat'), и обе версии делают autoescaping. – dhke
Я думаю, что самым большим преимуществом первого является то, что намного проще, если у вас есть много параметров для INSERT в базу данных, чтобы вы могли легко избежать ошибок таким образом. Поэтому я придерживаюсь первого. –