cassandra 使用Python驱动程序插入数据会返回“Syntax error in CQL query”

muk1a3rh  于 2023-03-29  发布在  Cassandra
关注(0)|答案(3)|浏览(184)

我刚到Cassandra,现在我面临着数据类型问题
每当我试图插入数据作为文本类型,我得到以下错误

[Syntax error in CQL query] message="line 1:103 no viable alternative at input ',' (... filepath) VALUES (0, [P2],...)">

这里我创建了一个名为batch_rows的表,可以看到node_id的类型为text

self.session.execute("""
            CREATE TABLE IF NOT EXISTS batch_rows (
                local_pid int,
                node_id text,
                camera_id int,
                geolocation int,
                filepath int,
                PRIMARY KEY (local_pid, node_id)
            )
            """)

但每当我做插入它给了我上面的错误,这是我的插入声明:

local_pid = i
    node_id= 'P2'
    camera_id= 1
    geolocation= 4
    filepath = 3
                
    self.session.execute('INSERT INTO %s (local_pid, node_id, camera_id, geolocation, filepath) VALUES (%s, %s, %s, %s, %s) ' % 
    (table, local_pid, node_id, camera_id, geolocation, filepath))

事实上我现在有点卡住了,有没有人面对这个?谢谢大家

axr492tv

axr492tv1#

使用%对值进行类型转换是无效的,因此产生的CQL查询返回语法错误:

... % (table, local_pid, node_id, camera_id, geolocation, filepath) ...

下面是一个包含位置占位符有效格式的示例代码:

session.execute(
    """
    INSERT INTO batch_rows (local_pid, node_id, camera_id, geolocation, filepath)
    VALUES (%s, %s, %s, %s, %s)
    """,
    (local_pid, node_id, camera_id, geolocation, filepath)
)

我也赞同@Aaron的建议,即避免以编程方式更改模式,以避免模式不一致。
有关如何执行查询的其他示例,请参阅Cassandra Python驱动程序Getting Started Guide。干杯!

sxpgvts3

sxpgvts32#

因此,字符串解析CQL语句并将每个值转换为字符串是行不通的。我会构建一个如下所示的预处理语句:

insert_table1 = """
    INSERT INTO batch_rows (local_pid, node_id, camera_id, geolocation, filepath)
    VALUES (?, ?, ?, ?, ?)
"""

pStatement = session.prepare(insert_table1);

local_pid = 219
node_id= 'P2'
camera_id= 1
geolocation= 4
filepath = 3

session.execute(pStatement,(local_pid, node_id, camera_id, geolocation, filepath))

另外,我不会从应用程序代码中执行CREATE语句,这会很快导致模式不一致。

uplii1fm

uplii1fm3#

恐怕你错误地使用了带有位置参数的准备语句。请参阅这里的文档。
如果你试着像下面这样做呢?

self.session.execute("""INSERT INTO batch_rows (local_pid, node_id, camera_id, geolocation, filepath) VALUES (%s, %s, %s, %s, %s)""",(local_pid, node_id, camera_id, geolocation, filepath))

相关问题