Preparing Cassandra SELECT Statements in Python -
i'm trying run prepared select queries against cassandra table.
the table defined such:
class emailaddresslookup(model, modeloperations, jsonserializer): __table_name__ = 'email_address_lookup' email_address = columns.text(primary_key=true) user_id = columns.integer(primary_key=true)
my insert works great. looks this:
i_email_lookup = session.prepare("""insert email_address_lookup (user_id, email_address) values (?, ?)""") session.execute(i_email_lookup, (user_id, email_address))
however, select not working. looks this:
s_email_lookup_by_email = session.prepare('select user_id email_address_lookup "email_address"=?') session.execute(s_email_lookup_by_email, email_address)
here's traceback when email_address 27-char string:
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: many arguments provided bind() (got 27, expected 1)
okay, python tried turn 27-char string 27 args? let's wrap in tuple:
session.execute(s_email_lookup_by_email, (email_address, ))
this prevents traceback, query returns none when data base has matching email address in it.
this:
session.execute(s_email_lookup_by_email, (email_address))
doesn't pass 1-tuple execute
method.
in python, create 1-tuple need follow first element comma:
session.execute(s_email_lookup_by_email, (email_address,))
otherwise parentheses interpreted grouping operators , makes (email_address)
equivalent email_address
without parentheses.
Comments
Post a Comment