2

Python でアクセスしようとしている Sqlite3 テーブルがあります。値にアポストロフィが含まれる 1 つのテーブル列 (例: George's) を除いて、すべてが正常に機能しています。

私はSQLを解決しました

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

の場合、構文エラーが発生しますvalue2 = George's

これに対する正しい Python 構文は何ですか?

4

3 に答える 3

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 に答える
1

バックスラッシュを使用して、アポストロフィをエスケープします。例えば:

select * from tablename where columnname='George\'s'
于 2013-07-19T20:18:26.977 に答える
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

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
于 2013-07-19T20:37:21.260 に答える