将值从python列表传递给Cassandra查询

时间:2017-09-13 15:31:29

标签: python python-2.7 cassandra

初学者。 我有以下情况。

  • 每行包含名称的文本文件。
  • 一个cassandra 3.5数据库
  • 一个python脚本

目的是让脚本一次从文件中读取一行(一个名称),并使用该名称查询Cassandra。

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

我目前有类似的东西:

#... 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)

如果我删除标记名列表组件并使用名称值编辑查询本身,一切正常。

我在这里做错了什么?

3 个答案:

答案 0 :(得分: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中的文档/多行注释)

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

答案 1 :(得分: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)

答案 2 :(得分:0)

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

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