2015-07-12 3 views
1

КодЧтобы отличить имя переменной от имени поля БД в Python

import psycopg2 
import psycopg2.extras 
def store_values_to_pg94(file_size, connection): 
    cursor = connection.cursor() 
    cursor.execute(
     INSERT INTO measurements 
     (file_size) 
     VALUES (file_size) 

где имя поля столбца в PostgreSQL 9.4 file_size но имя переменной также в Python file_size.

Как вы можете избежать такого конфликта?

ответ

2

Код из вашего примера не скомпилирован, то есть он недействителен 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 и нужны различные заполнители параметров (или подходящую оболочку).

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

+0

Я использую 'psycopg2'. Какой стиль используется по умолчанию в 'psycopg2'? Последний стиль легче читать, чем первый. Однако, если есть autoescape только в первом, то это должно быть лучше. –

+0

'psycopg2' принимает оба (например, он правильно реализует' paramstyle == pyformat'), и обе версии делают autoescaping. – dhke

+0

Я думаю, что самым большим преимуществом первого является то, что намного проще, если у вас есть много параметров для INSERT в базу данных, чтобы вы могли легко избежать ошибок таким образом. Поэтому я придерживаюсь первого. –

Смежные вопросы