2017-05-10 58 views
0

Psycopg2を使用して私のpostgresデータベースにdatetime値を挿入しようとしています。psycopg2にdatetimeを渡す

私のコードは以前は動作していましたが、%s表記法から{}表記法に切り替わり、コードが壊れました。ここ

は私のコード

for j in eveLists.itemList: 
    tempPrice = fetchSellPrice(i, j) 
    database_name = eveLists.DatabaseDict[i] 
    now = datetime.datetime.utcnow() 

    cur.execute("INSERT INTO {0} VALUES ({1}, {2}, {3}, NULL, {4}, {5}, NULL);".format(
                         database_name, 
                         str(i), 
                         str(j), 
                         float(tempPrice), 
                         datetime.date.today(), 
                         now)) 

である私は、次のエラーを取得する:

psycopg2.ProgrammingError: syntax error at or near "00" 
LINE 1: ...0000142, 2268, 3.11, NULL, 2017-05-09, 2017-05-10 00:40:03.3... 
                  ^

それは二つの別々のオブジェクトとして日付と時刻を扱っています。

私はコメントアウトされているいくつかの異なる方法を試して、すべてのさまざまなエラーメッセージをスローします。私は、引用符で日時を包むエラー

psycopg2.ProgrammingError: column "mydate" is of type date but expression is of type integer 
LINE 1: ...NTO temp_jita VALUES (30000142, 2268, 3.11, NULL, 2017-05-09... 
                  ^
HINT: You will need to rewrite or cast the expression. 

それは私の日は、私は引用符で包まれていても、整数であると考えて与える

now = ("'%s'") % str(datetime.datetime.utcnow()) 

を試してみました。私は手動でもpsycopg2のタイムスタンプを作成しようとしている

次のエラー与え
now = psycopg2.Timestamp(now.strftime("%Y"), 
            now.strftime("%m"), 
            now.strftime("%d"), 
            now.strftime("%h"), 
            now.strftime("%M"), 
            int(now.strftime("%-S"))) 

int(now.strftime("%-S"))) 
TypeError: an integer is required (got type str) 

を私はそれが特にI以来、これは文字列であると考える方法がわかりませんintとしてキャスト!

ご協力いただければ幸いです。

EDIT:

for j in eveLists.itemList: 
      tempPrice = fetchSellPrice(i, j) 
      database_name = eveLists.DatabaseDict[i] 
      now = datetime.datetime.utcnow() 
      now = str(now) 

      cur.execute("INSERT INTO %s VALUES (%s, %s, %s, NULL, %s, %s, NULL);", [database_name, 
                        str(i), 
                        str(j), 
                        float(tempPrice), 
                        datetime.date.today(), 
                        now 
                        ]) 

psycopg2.ProgrammingError: syntax error at or near "'temp_jita'" 
LINE 1: INSERT INTO 'temp_jita' VALUES ('30000142', '2268', 3.03, NU... 
        ^

主題に関する私の以前の記事を参照してください:私は、次のコードのエラーを受信したため、%sの表記は{}表記を使用して変数を通過しない理由How to remove the quotes from a string for SQL query in Python?

EDIT:このリンク(http://initd.org/psycopg/docs/sql.html)から@Zorgのアドバイスに続いて、このコードは私の仕事:

cur.execute(sql.SQL("INSERT INTO {} VALUES (%s, %s, %s, NULL, %s, %s, NULL);").format(sql.Identifier(database_name)),[ 
                        str(i), 
                        str(j), 
                        float(tempPrice), 
                        datetime.date.today(), 
                        now 
                        ]) 
+0

このカラムはDBには何種類?そして1つのケースではエラーはフィールド4であり、もう1つはフィールド5であるため、このポストは混乱しますか? –

+0

と 'str(今)'に日付をラップすれば? –

+0

str(今)のようにラップすると、その時点で最初のエラーが発生します。 –

答えて

1

あなたは赤があります?

もしそうでなければ、それをためらうことを躊躇しないでください。問合せにのparamsを渡す

Warning Never, never, NEVER use Python string concatenation (+) or string parameters interpolation (%) to pass variables to a SQL query string. Not even at gunpoint.

適切な方法を以下に示します。

SQL = "INSERT INTO authors (name) VALUES (%s);" # Note: no quotes 
data = ("O'Reilly",) 
cur.execute(SQL, data) # Note: no % operator 
+0

私は%sを使ってみましたが、(name)フィールドに変数を渡すと、引用符が追加され、SQLコードが壊れます。それで{}表記を使用したのです。 –

+0

それを入手しました。psycopg2のSQL識別子をテンプレートにするより詳しい方法 はhttp://initd.org/psycopg/docs/sql.html – Zorg

+0

ありがとうございます。これは私のための正しい記事のように見えます。 –

1

AsIsquote_ident

from psycopg2.extensions import AsIs, quote_ident 

cur.execute(""" 
    INSERT INTO %s 
    VALUES (%s, %s, %s, NULL, %s, %s, NULL); 
""", (
    AsIs(quote_ident(database_name, cur)), 
    str(i), 
    str(j), 
    float(tempPrice), 
    datetime.date.today(), 
    now 
)) 
関連する問題