我有一个用于构造Cassandra查询的示例方法,我正在寻找一种更安全地在查询中参数化表名而不使用字符串格式的方法。
比如说,
def some_method(self, table_name):
statement = f"SELECT COUNT(*) FROM {self.table_name}"
results = self.cassandra.session.execute(query=statement)
...
字符串
我不相信SimpleStatement
或PreparedStatement
可以用来绑定表名。
1条答案
按热度按时间lsmepo6l1#
如果您使用的是DataStax's Python Driver for Cassandra (as of v3.28),则无法使用Session.execute / Session.execute_async参数化或绑定表名,因为它只期望列值在
parameters
参数中,而表名在statement
字符串中被硬编码。您将不得不求助于字符串格式,这会使您的链接器抱怨可能的SQL注入(然后您必须使用# noqa
等方法使其静音)。我通过使用
cassandra.cqlengine.models
来解决这个问题,它仍然是同一个Python驱动程序包的一部分:https://docs.datastax.com/en/developer/python-driver/3.28/api/cassandra/cqlengine/models/。您可以在运行时动态地为表创建模型(在此期间,您可以从某处传递表名),然后使用该模型执行查询。
首先定义一个抽象模型:
字符串
然后在运行时,创建一个具体模型:
型
type
调用是Python内置的type
函数,用于创建类型,在本例中是基于cassandra.cqlengine.models.Model
的具体Person
类。type
的参数依次为:table_name
)(MyAbstractModel,)
)table_attrs
),在本例中应为__table_name__
(请参见https://docs.datastax.com/en/developer/python-driver/3.28/api/cassandra/cqlengine/models/)如果代码成功运行,您将看到表已创建:
型
一旦你得到了你的表,你现在可以使用它来使你的查询 * 作为使用 *
session.execute
的替代。根据您需要创建的表的数量,您可能需要将表名Map到它们的模型:型
复制问题中的示例,其中表名是
some_method
的参数:型
由于模型是动态创建的,因此只需确保
__table_name__
和type
名称一致阅读Making Queries的文档和模型。