2015-10-04 55 views
3

林有我的数据库名称表音。表的声音得到了这些列:我的查询不起作用PostgreSQL相关的Python

START_TIME,END_TIME,Salience_Label,Class_Label,比特率,位深度,采样率我想要查询我的数据库(从组合框中选择一些东西,然后在条目中写入内容)。我得到了一个值。正确的值从组合框和条目(我打印它们)。 所以我connecto与命令

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

到DB这个我想创建我的查询字符串

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并且我已经在书写中输入值。 但从CMD我得到这个消息

ProgrammingError:列“比特深度”不存在 LINE 1:SELECT * FROM声音WHERE一位深度=“1536”

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

+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()得到列名动态,所以这是不行的。

不幸的是,必须使用字符串连接,因为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调试器修改您的Web窗体并向您的组合框添加新选项");DROP TABLE sounds;--时,您不会丢失数据。