【问题标题】:How to pass the table name in parameter in cassandra python如何在cassandra python的参数中传递表名
【发布时间】:2019-01-22 06:00:08
【问题描述】:

我想在 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 注入的安全

谢谢

【问题讨论】:

    标签: python cassandra


    【解决方案1】:

    您需要使用准备好的查询而不是该方法 - 当您使用 %s 占位符时,查询未准备好,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

    【讨论】:

    • 我的情况没问题,但你确定注射的安全性吗?尤其是这一行:stmt = "select * from %s.%s where id =?".format(ks, table)
    • 不,不确定 - 这只是一个例子 :-)
    猜你喜欢
    • 2020-11-09
    • 2014-03-14
    • 2017-05-31
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多