3

私は Python 2.7で PyMySQL を利用しており、次のステートメントを実行しようとしています。

'INSERT INTO %s (%s, %s) VALUES (%s, %s) ON DUPLICATE KEY UPDATE %s = %s'

次のパラメータを使用します。

('artikel', 'REC_ID', 'odoo_created', u'48094', '2014-12-23 10:00:00', 'odoo_modified', '2014-12-23 10:00:00')

常に次のようになります。

{ProgrammingError}(1064, u"SQL 構文にエラーがあります。''artikel' ('REC_ID', 'odoo_created') の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください\n
VALUES ('48094', '2014-12-' at line 1")

PyMySQL がフォーマット中にすべての文字列をエスケープしているように思えます。テーブル名や列名などのデータベース識別子でそれを防ぐにはどうすればよいですか? SELECT文字列リテラル ( SELECT * FROM "table") からの s は、テーブル ( ) と比較して不可能であるため、ステートメントが破損しSELECT * FROM tableます。

4

1 に答える 1

1

それがDB APIの代用のポイントです。値をエスケープします。テーブル/列名をエスケープする必要はありません。

私は次のようなものを使用します:

execute('''INSERT INTO {} ({}, {}) VALUES (%s, %s) ON DUPLICATE KEY UPDATE {} = %s'''
    .format('artikel', 'REC_ID', 'odoo_created', 'odoo_modified'),
    (u'48094', '2014-12-23 10:00:00', '2014-12-23 10:00:00')
)

または、名前を直接書くだけです。

于 2014-12-23T10:45:35.213 に答える