3

特定の INSERT SQL ステートメントを作成する小さなスクリプトがあります。

postgresql の場合、挿入する値を 2 つの単一引用符で囲む必要があります。

残念ながら、挿入される値の文字列の一部には一重引用符も含まれているため、それらを自動的にエスケープする必要があります。

for line in f:
    out.write('(\'' + line[:2] + '\', \'' + line[3:-1] + '\'),\n')

line[3:-1]内部の一重引用符 (' など)が自動的にエスケープされるようにするにはどうすればよいですか?

ありがとう、

アップデート:

例えば、ライン

CI|Cote D'ivoire

失敗したため '

更新 2:

値に二重引用符を使用できません。

INSERT INTO "App_country" (country_code, country_name) VALUES ("AF", "Afghanistan")

エラーメッセージが表示されます:ERROR: column "AF" does not exist

ただし、これは正常に機能します。

INSERT INTO "App_country" (country_code, country_name) VALUES ('AF', 'Afghanistan')

4

5 に答える 5

3

PEP-249で説明されているように、DBPIはさまざまなデータベースへの汎用インターフェイスです。データベースごとに異なる実装が存在します。postgresにはpsycopgがあります。ドキュメントから:

cur.execute(
...     """INSERT INTO some_table (an_int, a_date, a_string)
...         VALUES (%s, %s, %s);""",
...     (10, datetime.date(2005, 11, 18), "O'Reilly"))

パラメータをタプルで渡すだけです。基礎となるライブラリはあなたのためにそれをエスケープします。これは、自分でロールしようとするよりもはるかに安全で簡単です。

于 2012-07-06T23:40:43.003 に答える
2

生成された独自のエスケープを DML に使用しないでください。Keith が述べたように、適切な DBAPI を使用します。さまざまなソースからのエスケープと型変換がほぼ透過的に行われるようにするための作業が必要でした。-などの DDL を使用しているCREATE TABLE whatever (...)場合、独自のデータソースを信頼していれば、少し怠惰になる可能性があります。

例に示すデータを使用:

import sqlite3

text = "CI|Cote D'ivoire" # had to been escaped as it's a string literal, but from another data source - possibly not...

code, name = text.split('|', 1)

db = sqlite3.connect(':memory:')
db.execute('create table something(code, name)')
db.execute('insert into something(code, name) values(?, ?)', (code, name))

for row in db.execute('select * from something'):
    print row
# (u'CI', u"Cote D'ivoire")
于 2012-07-07T00:32:09.193 に答える
2

引用符をエスケープする SQL の標準的な方法は、引用符を 2 倍にすることです。

'This won''t be a problem.'

したがって、すべての引用符を 2 つの引用符に置き換えます (Python では二重引用符を使用して正気を保ちます)。

out.write("('" + line[:2] + "', '" + line[3:-1].replace("'", "''") + "'),\n")
于 2012-07-07T00:04:13.333 に答える
1

エスケープ文字を文字列に追加するための完全なソリューションについては、次を使用します。

re.escape(string)
>>> re.escape('\ a.*$')
'\\\\\\ a\\.\\*\\$'

詳細については、http: //docs.python.org/library/re.htmlを参照してください。

于 2012-07-06T22:59:55.910 に答える
0

SQL 関連の制限があるかどうかはわかりませんが、常に二重引用符を使用して、単一引用符を含む文字列を囲むことができます。

例えば。

print "That's all Folks!"

または二重引用符を囲む単一引用符:

print 'The name of the file is "rosebud".'
于 2012-07-06T22:47:17.957 に答える