JayDeBe:将日期存储到AS400 / DB2(jt400驱动程序)

时间:2018-03-07 01:37:03

标签: python sql db2 jt400

我试图通过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中? 或者我可以尝试做什么建议?

关心Volker

1 个答案:

答案 0 :(得分: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-snippets和变量作为文本

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

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