JayDeBe:将日期存储到 AS400/DB2(jt400 驱动程序)
JayDeBe: Store a date into an AS400/DB2 (jt400 driver)
我正在尝试通过 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 中?
或者我可以尝试做什么的任何建议?
问候沃尔克
解决方案
在多尝试了一点之后我发现
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-injections 和文本变量中带有单引号的错误并且是 几乎无法阅读。
我正在尝试通过 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 中? 或者我可以尝试做什么的任何建议?
问候沃尔克
解决方案
在多尝试了一点之后我发现
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-injections 和文本变量中带有单引号的错误并且是 几乎无法阅读。