我有一个我试图用Python访问的Sqlite3表。一切都运行良好,除了一个表列,其中值包含撇号(例如乔治)。
我已经解决了SQL
"SELECT * FROM table WHERE column1 = '" + value1 + "' and column2 = '" + value2 + "'"
但value2 = George's
时会出现语法错误。
这是什么样的Python语法?
答案 0 :(得分:1)
使用反斜杠来逃避撇号。例如:
select * from tablename where columnname='George\'s'
答案 1 :(得分:1)
首先:必须链接:Exploits of a Mom
为了避免这种情况,你应该使用占位符。这是一个python问题,所以python回答:
>>> import sqlite3
>>> con = sqlite3.connect(':memory:')
>>> cur = con.cursor()
>>> cur.execute("select ?", ['this contains quotes: "\'"']).fetchall()
[(u'this contains quotes: "\'"',)]
对于查询的非动态部分,“转义”机制是将引号加倍:
>>> cur.execute("select ''''").fetchall()
[(u"'",)]
?
是sqlite和其他许多其他人的占位符,但是对于您实际使用的数据库,正确的占位符可能不同。其他常见语法是:param
(PostgreSQL)和%s
(MySQL)
答案 2 :(得分:0)
执行此操作的一种好方法是在查询中使用占位符来真正避免SQL injection
的问题这是一个简单的例子:
<强>码强>
#!/usr/bin/env python
import sqlite3
dbc = sqlite3.connect('test.db')
c = dbc.cursor()
name = "george's"
query = "select * from names where name = ?"
c.execute(query, (name,))
for row in c.fetchall():
print row
输出包含DB中行的元组:
(1, u"george's")
sqlite3表:
sqlite> .schema names
CREATE TABLE names(id integer primary key asc, name char);
sqlite> select * from names;
1|george's
2|dave
3|george