2015-10-04 5 views
3

Im имея в моей базе данных таблица с названием звуки .table звуки получили следующие столбцы:Мой запрос не работает Postgresql-Python

Start_Time, END_TIME, Salience_Label, Class_Label, битрейт, глубина цвета, оцифровки

Я использую combobox, значения которого являются моими именами столбцов. У меня также есть запись, в которой я пишу некоторые значения. Я хочу запросить мою базу данных (выберите что-нибудь из выпадающего списка и напишите что-нибудь в записи). правильные значения из выпадающего списка и из записи (я печатаю их). Так я Connecto к БД с помощью команды

conn = psycopg2.connect(conn_string) 
cursor = conn.cursor() //create cursor 

После этого я хочу создать строку запроса

SQL = "SELECT * FROM sounds WHERE "+str(app.box.get())+" = '"+str(entry_text)+"'" 

, а затем я пытаюсь запросить мою БД с помощью команды

cursor.execute(SQL) 
rows = cursor.fetchall() 
for row in rows: 
    print row 
cursor.close() 
conn.close() 

я выберите из combobox значение Bitdepth и у меня есть запись в записи значение . Но из ЦМД я получил это сообщение

ProgrammingError: колонка «глубина цвета» не существует ЛИНИЯ 1: SELECT * FROM звуков WHERE глубина цвета = «1536»

Я знаю, что это не правильный способ запрос мой db.Пожалуйста, помогите, спасибо!

+1

Ваш запрос должен выглядеть так: 'SELECT * FROM sounds WHERE" Bitdepth "= '1536''. – klin

+0

Спасибо, его работа. Очень приятно! –

ответ

2

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

Однако, читайте дальше.


Вы пишете небезопасный код, уязвимый для SQL injection. Не используйте конкатенацию строк для сборки SQL.

Фиксация этого также исправит вашу ошибку. Если имя столбца постоянно вы бы просто написать:

SQL = "SELECT * FROM sounds WHERE columnname = %s" 
cursor.execute(SQL, (entry_text,)) 

... но это выглядит, как вы пытаетесь получить имя столбца динамически из app.box.get(), так что это не будет работать.

К сожалению, do должен использовать для этого конкатенацию строк, поскольку psycopg2 не предоставляет метод цитирования идентификатора. Это безопасно, если вы тщательно процитируете идентификатор, например.

quoted_colname = '"' + str(app.box.get()).replace('"','""') + '"' 
SQL = "SELECT * FROM sounds WHERE "+quoted_colname+" = %s" 
cursor.execute(SQL, (str(app.box.get()), entry_text)) 

Процитировано сделано просто. Оберните идентификатор в двойные кавычки и удвоьте любые двойные кавычки в имени идентификатора, так что " станет "".

Таким образом, когда злоумышленник использует отладчик JavaScript для изменения вашей веб-формы и добавления новой опции ");DROP TABLE sounds;-- в свою комбинированную ячейку, вы не потеряете свои данные.

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