我使用Python 3.5.3通过插入操作访问impala数据库。 命令如下:
sql = "INSERT INTO user_tbl(ID, USER_IP)VALUES(?,?)"
values = (89988, '3609:9802:480:77bd:434:2d9a:e204:47b0')
cur.execute(sql, values);
但是如果我使用cur.execute("INSERT INTO user_tbl(ID, USER_IP)VALUES(89988, '3609:9802:480:77bd:434:2d9a:e204:47b0')")
运行,结果就会成功。
错误是
“impala.error.HiveServer2Error:AnalysisException:语法错误 第1行:“
遇到:STRING LITERAL预期:CROSS,FROM,FULL,GROUP, HAVING,INNER,JOIN,LEFT,LIMIT,OFFSET,ON,ORDER,RIGHT, STRAIGHT_JOIN,UNION,USING,WHERE,COMMA
答案 0 :(得分:0)
Impyla的值替换格式为%s
,甚至是%(name)s
。
它使用impala.dbapi.paramstyle
等于'pyformat'
,因为它与Python DB-API 2.0兼容,that means:
Python扩展格式代码,例如... WHERE name =%(name)s
尝试
sql = "INSERT INTO user_tbl (ID, USER_IP) VALUES (%s, %s)"
values = (89988, '3609:9802:480:77bd:434:2d9a:e204:47b0')
cur.execute(sql, values)
(当%(name)s
为values
而不是dict
时,可以使用tuple
格式。)
答案 1 :(得分:0)
问题是冒号:
分隔整数。它以某种方式弄乱了数据类型定义。有人说必须冒号,但是转义在插入语句open bug for it中不能正确工作。
我有一个类似的问题,我必须将日期时间存储为以下格式的字符串:“ YYYY-MM-DDTHH:mm:ss”。用冒号分隔的整数给我一个类似的错误:
Encountered: INTEGER LITERAL
Expected: AND, AS, ASC, BETWEEN,...
有人说,您可以转义特殊字符with their unicode codes。我尝试用其代码:
和\u003A
替换\\u003A
,但没有一个适合我。
我最终用破折号或句号代替了冒号。 这也解释了为什么IPv4(而不是IPv6)为您@leishton工作。