Python访问带有插入错误的impala

时间:2017-01-25 04:02:12

标签: python impala

我使用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

2 个答案:

答案 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)svalues而不是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工作。