2015-06-13 46 views
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,即使数据库肯定有它匹配的电子邮件地址。

回答

5

此:

session.execute(s_email_lookup_by_email, (email_address)) 

并没有真正通过一个1元组到execute方法。

在Python中,创建一个1元组需要遵循的第一个元素之间用逗号:

session.execute(s_email_lookup_by_email, (email_address,)) 

否则括号中解释为分组运算符,这让(email_address)相当于email_address没有括号。

+0

好抓!正确设置元组可以防止错误发生,但是现在execute()返回None,即使我确定表中有匹配的数据。 –

+1

@AdamSteele我认为'WHERE'子句中''email_address''的引号是不必要的。也许CQL尝试将参数与'“email_address”'字符串进行比较,并导致几乎总是错误的情况。 – soulcheck

+0

好主意。可悲的是,它似乎没有或没有引号返回None。 –