3
我试图对Cassandra表运行准备好的select查询。在Python中准备Cassandra SELECT语句
表的定义是这样的:
class EmailAddressLookup(Model, ModelOperations, JSONSerializer):
__table_name__ = 'email_address_lookup'
email_address = columns.Text(primary_key=True)
user_id = columns.Integer(primary_key=True)
我INSERT的伟大工程。它看起来像这样:
i_email_lookup = session.prepare("""INSERT INTO email_address_lookup (user_id, email_address) VALUES (?, ?)""")
session.execute(i_email_lookup, (user_id, email_address))
然而,我的选择是行不通的。它看起来像这样:
s_email_lookup_by_email = session.prepare('SELECT user_id FROM email_address_lookup WHERE "email_address"=?')
session.execute(s_email_lookup_by_email, email_address)
这里的时候EMAIL_ADDRESS是一个27字符的字符串回溯:
Traceback (most recent call last):
File "/home/thisguy/Documents/my_proj/api/models/case.py", line 428, in _lookup_usin_email
matches = my_projcluster.select_email_lookup_by_email(self.email)
File "/home/thisguy/Documents/my_proj/api/utils/decorators.py", line 14, in newfunc
result = func(*args, **kwargs)
File "/home/thisguy/Documents/my_proj/api/models/my_projcluster.py", line 203, in select_email_lookup_by_email
session.execute(s_email_lookup_by_email, (email_address))
File "/home/thisguy/.Envs/my_proj/lib/python3.4/site-packages/cassandra/cluster.py", line 1403, in execute
future = self.execute_async(query, parameters, trace)
File "/home/thisguy/.Envs/my_proj/lib/python3.4/site-packages/cassandra/cluster.py", line 1452, in execute_async
future = self._create_response_future(query, parameters, trace)
File "/home/thisguy/.Envs/my_proj/lib/python3.4/site-packages/cassandra/cluster.py", line 1464, in _create_response_future
query = query.bind(parameters)
File "/home/thisguy/.Envs/my_proj/lib/python3.4/site-packages/cassandra/query.py", line 390, in bind
return BoundStatement(self).bind(values)
File "/home/thisguy/.Envs/my_proj/lib/python3.4/site-packages/cassandra/query.py", line 486, in bind
(len(values), len(col_meta)))
ValueError: Too many arguments provided to bind() (got 27, expected 1)
好了,所以Python试图将一个27字符字符串转换成27个ARGS?让我们把它包在一个元组:
session.execute(s_email_lookup_by_email, (email_address,))
这避免了回溯,但查询返回None,即使数据库肯定有它匹配的电子邮件地址。
好抓!正确设置元组可以防止错误发生,但是现在execute()返回None,即使我确定表中有匹配的数据。 –
@AdamSteele我认为'WHERE'子句中''email_address''的引号是不必要的。也许CQL尝试将参数与'“email_address”'字符串进行比较,并导致几乎总是错误的情况。 – soulcheck
好主意。可悲的是,它似乎没有或没有引号返回None。 –