2

我有一个试图用 Python 访问的 Sqlite3 表。除了一个表列的值包含撇号(例如 George's)外,一切都运行良好。

我已经制定了SQL

"SELECT * FROM table WHERE column1 = '" + value1 + "' and column2 = '" + value2 + "'"

但是当value2 = George's.

什么是正确的 Python 语法?

4

3 回答 3

1

使用反斜杠转义撇号。例如:

select * from tablename where columnname='George\'s'
于 2013-07-19T20:18:26.977 回答
1

第一:必修链接:妈妈的剥削

为了避免这种事情,你应该使用占位符。这是一个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)

于 2013-07-19T20:33:46.400 回答
0

一个很好的方法是在查询中使用占位符来真正避免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
于 2013-07-19T20:37:21.260 回答