2017-04-06 8 views
0

私はpsycopgを使ってpostgresに挿入しようとしているタイムスタンプを持っていますが、問題を解決するのに問題があります。私はPythonの文字列フォーマット日付を正しい位置にドロップします。私はこのようなものを持っていますpsycopgタイムスタンプを書式設定しないで挿入

values = {"timestamp": u'2016-03-01T12:40:45.236697', ...} 
"INSERT...VALUES(...{timestamp}...)".format(**values) 

Postgresは構文エラーを投げて "T"上に足を踏み入れています。

私は、DateTimeオブジェクトに文字列を変換しようとしたが、その後の書式が戻ったばかりのこの

2016-03-01 12:40:45.236697 

とpostgresのスペースにハングアップするように見える文字列に格納します。私はPGをto_timestamp()を使用しようとしましたが、PGは同じ場所でハングアップします。私はこれらのいくつかで終わるでしょう、そして、私はこれをいくつかの文字列に分解しないようにしています。誰にもアイデアはありますか?私が必要なら元のタイムスタンプ文字列を操作することはできますが、PGを幸せにするためにその文字列がどのように見えるのか理解できません。

ありがとうございます事前にありがとうございます

+0

https://xkcd.com/327/ –

答えて

3

あなたはそのような文字列をフォーマットしないでください。 Iljaがコメントで言及しているように、あなたはSQLインジェクション攻撃に脆弱です。代わりに、例えば、.execute()に2番目の引数として辞書を渡す必要があります。:

import datetime as dt 
t = u'2016-03-01T12:40:45.236697' 
cur.execute(
    """INSERT INTO your_table (timestamp, ...) 
     VALUES (%(timestamp)s, ...);""", 
    {'timestamp': dt.datetime.strptime(t,'%Y-%m-%dT%H:%M:%S.%f'), ...}) 

これは、正しいデータ型が挿入されていることを保証し、psycopg2があなたのためにエスケープを処理します。

+0

ありがとう、バーニー。これは内部APIであり、すべてのコンテンツを管理しているため、SQLインジェクションについても考えていませんでしたが、もっと良い方法があるはずです。私はpsycopg2のドキュメントにもっと詳しく調べていきます。 – gignosko

+0

@gignosko:あなたは大歓迎です。私はpsycopg2のドキュメントであなたに運がいいですね!ハッピーコーディング:-) – bernie

関連する問題