2017-09-13 2 views
0

ここから初心者。 私は次のような状況があります。pythonリストからCassandraクエリに値を渡す

  • 各行に名前が含まれているテキストファイル。
  • カサンドラ3.5データベース
  • Pythonスクリプト

意図が一度にファイル1行(1名)から読み込まれたスクリプトを持っており、その名前でカサンドラを照会することです。

参考までに、リストの値をクエリに渡すときを除いて、すべて正常に動作します。私はタグ名リストコンポーネントを削除し、名前の値をクエリ自体を編集した場合

#... 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])'の期待値は?それはNoneであり、根本原因です。 – 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つの引用符がドキュメント/複数の行コメントで使用されます)

これは別のエラーで終了する可能性があります。しかし、索引や読取り行を繰り返し処理するのではなく、行を繰り返し処理します。

+0

ありがとうございます。 3つの引用符、複数の行。とった。 コードを変更しました。それは私が行の数を読むことを避けるのを助けました。 クエリでは、スニペットごとに%sを{}に変更しました。 'TypeError:文字列書式中にすべての引数が変換されない' – bshakya

+0

@bshakyaこれはあなたがNoneオブジェクトを持っている可能性があります。デバッグプリントを使用して、元のプリントの前にタグ名 'print type(x)'のタイプを確認してください。 – Vinny

+0

観察します。 'print x'には明らかに\ nが最後に含まれています。だから私はそれを印刷すると、私は同様に印刷されている新しい行を見ることができます。私はそれが問題かもしれないと思いますか?それを削除して値を純粋な文字列に変換するにはどうすればよいですか? – bshakya

0

上記の@Vinnyからの回答を単純に構築すると、formatは単純にリテラル値を置き換えます。あなたはそれの周りに引用符を入れる必要があります。

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も格納されます。したがって、カッサンドラのクエリは実際にはクエリの一部として\nで動作しませんでした。私は変数にx.strip('\n')をして、それは完全に働いた。

関連する問題