1

我正在尝试通过 JayDeBe 将日期值输入到我们的 AS400/DB2 的日期字段中。

当我尝试使用文字 SQL 值时,一切正常

curs.execute('''
    UPDATE mytable
    SET city = ?,
        mydate = date(to_date('1999-05-03', 'YYYY-MM-DD'))
    WHERE id = ?''', ('Somewhere', 5))

当我将日期值放入参数时

curs.execute('''
    UPDATE mytable
    SET city = ?,
        mydate = date(to_date(?, 'YYYY-MM-DD'))
    WHERE id = ?''', ('Somewhere', '1999-05-03', 5))

我得到错误:

[..]
File "/usr/local/lib/python3.6/dist-packages/py4j/protocol.py", line 320, in get_return_value
format(target_id, ".", name), value)
py4j.protocol.Py4JJavaError: An error occurred while calling o1.prepareStatement.
: java.sql.SQLException: [SQL0171] Argument 01 der Funktion TO_DATE ungültig.
[..]

这意味着'函数 TO_DATE 的参数 01 无效'。

当我使用一个datetime.date值作为参数

curs.execute('''
    UPDATE mytable
    SET city = ?,
        mydate = ?
    WHERE id = ?''', ('Somewhere', datetime.date.today(), 5))

我得到错误

File "/usr/local/lib/python3.6/dist-packages/py4j/protocol.py", line 290, in get_command_part
command_part = REFERENCE_TYPE + parameter._get_object_id()
AttributeError: 'datetime.date' object has no attribute '_get_object_id'

有没有人成功地将日期存储到 AS400 中?或者有什么建议我可以尝试做什么?

问候沃尔克

4

1 回答 1

0

解决方案

在尝试了更多之后,我发现

curs.execute('''
    UPDATE mytable
    SET city = ?,
        mydate = date(cast(? as varchar(10)))
    WHERE id = ?''', ('Somewhere', '1999-03-05', 5))

或者

curs.execute('''
    UPDATE mytable
    SET city = ?,
        mydate = date(cast(? as varchar(10)))
    WHERE id = ?''', ('Somewhere', datetime.date.today().isoformat(), 5))

这意味着提供 ISO-8601 字符串并按date(cast(? as varchar(10))需要执行 , 。

如果是timestamp字段和datetime.datetime变量,您应该转换为varchar(26).

以及修补 SQL 片段和变量作为文本的另一种可能的解决方案

curs.execute("""
    UPDATE mytable
    SET city = ?,
        mydate = '""" + datetime.date.today().isoformat() +
    "'\nWHERE id = ?", ('Somewhere', 5))

是非常糟糕的做法,因为它会导致 - 在这种情况下不是日期 - 可能导致 SQL 注入和文本变量中带有单引号的错误,并且几乎不可读

于 2018-03-07T13:23:36.947 回答