我有一个试图用 Python 访问的 Sqlite3 表。除了一个表列的值包含撇号(例如 George's)外,一切都运行良好。
我已经制定了SQL
"SELECT * FROM table WHERE column1 = '" + value1 + "' and column2 = '" + value2 + "'"
但是当value2 = George's
.
什么是正确的 Python 语法?
使用反斜杠转义撇号。例如:
select * from tablename where columnname='George\'s'
第一:必修链接:妈妈的剥削
为了避免这种事情,你应该使用占位符。这是一个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)
一个很好的方法是在查询中使用占位符来真正避免SQL 注入问题
这是一个简单的例子:
代码
#!/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
它输出一个包含来自数据库的行的元组:
(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