2017-05-10 4 views
0

J'essaie d'insérer une valeur datetime dans ma base de données postgres en utilisant Psycopg2.Passage d'un datetime dans psycopg2

Mon code fonctionnait avant, mais je suis passé de la notation% s à la notation {}, et mon code s'est cassé.

ici est mon code

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)) 

Je reçois l'erreur suivante:

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... 
                  ^

Il est le traitement de la date et l'heure que deux objets distincts.

J'ai essayé plusieurs manières différentes qui sont commentées et toutes lancent divers messages d'erreur. J'ai essayé envelopper le datetime entre guillemets,

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

qui donnent une erreur

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. 

Il pense ma date est un entier, même si j'enveloppai entre guillemets.

J'ai également essayé de faire un horodatage psycopg2 manuellement:

now = psycopg2.Timestamp(now.strftime("%Y"), 
            now.strftime("%m"), 
            now.strftime("%d"), 
            now.strftime("%h"), 
            now.strftime("%M"), 
            int(now.strftime("%-S"))) 

Ce qui donne l'erreur suivante:

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

Je ne sais pas comment il pense que cela est une chaîne, d'autant plus que je jette-le comme un int!

Toute aide serait appréciée.

EDIT: La raison pour laquelle je suis passé les variables à l'aide {} notation et non notation s% est parce que je reçu une erreur pour le code suivant:

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'il vous plaît se référer à mon article précédent sur le sujet: How to remove the quotes from a string for SQL query in Python?

EDIT: suivant les conseils de » @Zorg de ce lien (http://initd.org/psycopg/docs/sql.html), ce code a fonctionné pour moi:

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

Quels types sont ces colonnes dans la DB? Et ce post est déroutant parce que dans un cas l'erreur est pour le champ 4, et dans un autre cas c'est pour le champ 5? –

+0

et si vous venez d'insérer des dates à 'str (now)'? .. –

+0

si vous l'enveloppez comme str (maintenant) vous obtenez la première erreur à l'heure. –

Répondre

1

Avez-vous rouge "Psycopg2 usage"?

Sinon, n'hésitez pas à le faire.

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

Une bonne façon de passer params dans une requête est présentée ci-dessous:

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

J'ai essayé d'utiliser% s, mais si vous passez une variable dans le champ (nom), elle ajoute des guillemets, ce qui casse le code SQL. C'est pourquoi j'ai utilisé la notation {}. –

+0

Got it.Kosher façon de modéliser les identifiants SQL dans psycopg2 est http://initd.org/psycopg/docs/sql.html – Zorg

+0

Merci Zorg. Cela ressemble au bon article pour moi. –

1

AsIs et quote_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 
))