向psycopg2传递数据时间[英] Passing a datetime into psycopg2

本文是小编为大家收集整理的关于向psycopg2传递数据时间的处理方法,想解了向psycopg2传递数据时间的问题怎么解决?向psycopg2传递数据时间问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在尝试使用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...
                                                             ^

它将日期和时间视为两个单独的对象.

我尝试了几种评论的方式,并且都投掷了各种错误消息.我尝试用引号包装DateTime,

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

给出错误

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.

它认为我的约会是一个整数,即使我用引号包裹了它.

我还尝试过手动制作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)

我不知道它是如何认为这是一根字符串的,尤其是因为我将其命名为int!

任何帮助将不胜感激.

编辑:我使用{}表示法而不是%s表示法是因为我收到以下代码错误的原因:

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

请参阅我以前的有关该主题的文章:如何从python中的sql查询字符串中删除引号?

编辑:遵循此链接@zorg的建议( http://initd.org/psycopg/docs/sql.html ),此代码对我有用:

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

推荐答案

您是否阅读过" psycopg2用法"

如果没有,请不要犹豫.

警告永远不会,永远不要使用python字符串串联(+)或字符串参数插值(%)将变量传递到SQL查询字符串.甚至都没有枪口.

将参数传递到查询的正确方法如下:

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

其他推荐答案

asis http://initd.org/psycopg/docs/extensions.html#psycopg2.extensions.quote_ident" rel =" noreferrer"> quote_ident 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
))

本文地址:https://www.itbaoku.cn/post/1764056.html