我的查询不起作用Postgresql-Python

时间:2015-10-04 18:54:57

标签: python postgresql psycopg2

我在我的数据库中有一个名为声音的表。表听起来有这些列:

START_TIME,END_TIME,Salience_Label,Class_Label,比特率,位深度,采样率

我正在使用一个组合框,其值是我的列名。我还有一个条目,我写了一些值。我想查询我的数据库(从组合框中选择一些东西并在条目中写一些东西)。我说得对组合框和条目中的值(我打印它们)。 所以我用命令

连接到db
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()

我从组合框中选择值 Bitdepth ,我在输入中写入值 1536 。 但是从cmd我收到了这条消息

ProgrammingError:列“bitdepth”不存在 第1行:SELECT * FROM声音WHERE Bitdepth ='1536'

我知道这不是查询我的db.Please帮助的正确方法,谢谢!

1 个答案:

答案 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;--时,您就不会丢失数据。