我在我的数据库中有一个名为声音的表。表听起来有这些列:
START_TIME,END_TIME,Salience_Label,Class_Label,比特率,位深度,采样率
我正在使用一个组合框,其值是我的列名。我还有一个条目,我写了一些值。我想查询我的数据库(从组合框中选择一些东西并在条目中写一些东西)。我说得对组合框和条目中的值(我打印它们)。 所以我用命令
连接到dbconn = 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帮助的正确方法,谢谢!
答案 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;--
时,您就不会丢失数据。