web-dev-qa-db-ja.com

python経由でcurrent_timestampをPostgresに挿入する方法

私はPGに行を挿入する必要がありますフィールドの1つはタイムスタンプ付きの日付と時刻です、これはインシデントの時刻ですので、挿入時にPostgresの-> current_timestamp関数を使用することはできませんその時点でcurrent_timestampによって作成されたのと同じ形式で、以前にpg行に収集した日時。

42
Max

タイムスタンプには「形式」はありません。

タイムスタンプを処理する推奨方法は、SQLのプレースホルダーを渡し、プログラミング言語のAPIを介して「実際の」オブジェクトを渡すPreparedStatementを使用することです。私はPythonを知らないので、PreparedStatementsをサポートしているかどうか、およびその構文がどのようになるかはわかりません。

生成されたSQLにタイムスタンプリテラルを挿入する場合は、値を指定する際にいくつかのフォーマットルールに従う必要があります(リテラルにはフォーマットがあります)。

Ivanの方法は機能しますが、PostgreSQLサーバーの構成に依存するかどうかは完全にはわかりません。

タイムスタンプリテラルを指定する構成(および言語)に依存しないソリューションは、ANSI SQL標準です。

_ INSERT INTO some_table 
 (ts_column) 
 VALUES 
 (TIMESTAMP '2011-05-16 15:36:38');
_

はい、キーワードTIMESTAMPの後にISOスタイルでフォーマットされたタイムスタンプが続きます(TIMESTAMPキーワードはそのフォーマットを定義します)

他の解決策は、入力リテラルの形式を指定できるto_timestamp()関数を使用することです。

_ INSERT INTO some_table 
 (ts_column) 
 VALUES 
 (to_timestamp('16-05-2011 15:36:38', 'dd-mm-yyyy hh24:mi:ss'));
_
63

psycopg2 (および場合によっては他のクライアントライブラリ)、Python datetime オブジェクトを パラメータとして単に渡すことができます SQLクエリ:

from datetime import datetime

dt = datetime.now()
cur.execute('INSERT INTO some_table (somecol) VALUES (%s)', (dt,))

より多くのPython SQLに適応できるタイプ(およびクエリの実行時にPythonオブジェクトとして返される)タイプがリストされます here

36
Eugene Yarmash
7
schlingel

日付と時刻の入力は、ISO 8601、SQL互換、従来のPOSTGRESなど、ほぼすべての合理的な形式で受け入れられます。一部の形式では、日付入力の月、日、年の順序があいまいであり、これらのフィールドの予想される順序を指定するサポートがあります。

つまり、何かを書くだけで機能します。

または、すべての明確な形式で この表 を確認します。

2
fiatjaf

確かに、そのタイムスタンプ列の文字列値を次の形式で渡します:'2011-05-16 15:36:38''PST'のようにタイムゾーンを追加することもできます)。 PostgreSQLは自動的に文字列をタイムスタンプに変換します。 http://www.postgresql.org/docs/9.0/static/datatype-datetime.html#DATATYPE-DATETIME-INPUT を参照してください

1
Ivan Krechetov