代码之家  ›  专栏  ›  技术社区  ›  EMottet

如何在cassandra python中传递参数中的表名

  •  1
  • EMottet  · 技术社区  · 5 年前

    我想在Cassandra查询中使用一个变量作为表名。

    可以这样做:

    self.session.execute(
                """
                INSERT INTO table_name (col1, col2)
                VALUES (%s, %s)
                """,
                ("1", "2")
            )
    

    但是,例如,我想做这样的事情

    self.session.execute(
                """
                INSERT INTO %s (col1, col2)
                VALUES (%s, %s)
                """,
                ("table_name","1", "2")
            )
    

    看起来不太对劲…

    当然我想保证SQL注入的安全

    谢谢

    1 回复  |  直到 5 年前
        1
  •  1
  •   Alex Ott    5 年前

    当您使用 %s placeholder,那么查询还没有准备好,Cassandra每次解析查询都会得到额外的开销。如果使用类似这样的方法,最好避免这种情况发生——定义一个将保存准备好的查询的映射,并在代码中使用将准备不在此缓存中的查询的函数。代码如下(未测试):

    queries = {}
    def get_query(session, stmt):
        global queries
        query = queries.get(stmt)
        if query is None:
           query = session.prepare(stmt)
           queries[stmt]=query
        return query
    

    然后在代码中:

     stmt = "select  * from %s.%s where id =?".format(ks, table)
     query = get_query(stmt)
     session.execute(query, [params])
    

    documentation 了解更多详细信息。