2017-09-13 48 views
0

初学者在这里。 我有以下情况。将python列表中的值传递给Cassandra查询

  • 一个文本文件,每行包含一个名称。
  • 一个卡桑德拉3.5数据库
  • Python脚本

的目的是使从一个时刻的文件,一个线(一个名字)读了剧本,并与该名称查询卡珊德拉。

仅供参考,一切工作正常,除了当我尝试将列表的值传递给查询。

我现在有这样的:如果我删除标记名列表组件和一个名称值编辑查询本身

#... driver import, datetime imports done above 
#... 

with open(fname) as f: 
content = f.readlines() 

# Loop for each line from the number of lines in the name list file 
# num_of_lines is already set 
for x in range(num_of_lines): 
    tagname = str(content[x]) 

    rows = session.execute("""SELECT * FROM tablename where name = %s and date = %s order by time desc limit 1""", (tagname, startDay)) 
    for row in rows: 
     print row.name + ", " + str(row.date) 

,一切工作正常。

我在这里做错了什么?

+0

你得到了什么? 'NameError:name'tagname'未定义'? – Vinny

+0

另外'tagname = str(content [x])'的期望值是多少?它可能是无,并且是根本原因。 – Vinny

+0

@Vinny不幸的是,我没有得到任何错误。 print row.name ....只是不打印。根本没有错误。现在,tagname = str(content [x])不是none。打印标记名完美工作。 – bshakya

回答

0

您可以通过简单地content迭代:

for x in content: 

    rows = session.execute("SELECT * FROM tablename where name = {} and date = {} order by time desc limit 1".format(x, startDay)) 
    for row in rows: 
     print row.name + ", " + str(row.date) 
    .... 

而且,你不需要有3个引号的字符串。单引号足够好(3引号用于文档/ python中的多行注释)

请注意,这可能以不同的错误结束;但是你将迭代行而不是遍历索引和读取行。

+0

谢谢。三个引号,多行。得到它了。 我修改了代码。它帮助我避免阅读行数。 在查询中,我根据您的代码段将%s更改为{}。我现在得到以下错误: 'TypeError:并非在字符串格式化过程中转换的所有参数 – bshakya

+0

@bshakya它可能是你有一个None对象。在您的原始打印之前使用调试打印来检查标签名称'打印类型(x)'的类型 – Vinny

+0

观察。 'print x'显然在其结尾包含一个\ n。所以当我打印它时,我可以看到正在打印的新行。我认为这可能是问题所在?我如何删除它并将其转换为纯字符串? – bshakya

0

只要在上面的@Vinny的答案上构建,格式就会简单地替换文字值。你需要在它周围加引号。

for x in content: 
    rows = session.execute("SELECT * FROM tablename where name ='{}' and date ='{}' order by time desc limit 1".format(x, startDay)) 
    for row in rows: 
     print row.name + ", " + str(row.date) 
0

谢谢,@Vinny和@tejas pandit供您参考。
您的输入帮助了我很多。然而,核心问题是另一回事。

正如问题中提到的,脚本从文件读取一行,将此行存储在变量中并将此变量传递给Cassaandra查询。当它从文件读取并存储一行到一个变量时,它还将新行\n存储在变量中。因此,Cassandra查询并不真正与\n一起作为其查询的一部分。我在变量上做了一个x.strip('\n'),它完美地工作。