2017-11-23 10 views
3

私は進捗openedgeデータベースからテーブルから最初の行を印刷しようとPythonとpyodbc参照行の値列名はダッシュ(ハイフン)を含ん

に新しいです。 (Windows 7の)ここで実行されていないコードブロックです:

cursor.execute("select my-nr, my-dt-my from mytable") 
row = cursor.fetchone() 
print(row.my-nr, row.my-dt-my) 

これはエラーに未定義の名前与える:私はそれを持っていると思います「NR」 未定義の名前「DT」 未定義名「私の」

をマイナス記号と関係するもの - ドットの背後にある記号。 (row.my-nr、row.my-dt-my)

以前にデータベースからテーブル名とカラム名を簡単に印刷することは簡単でしたが、何らかの理由で行を印刷するのが難しくなりました。

どのように行を印刷するのですか?

+0

1行以上が必要な場合は、fetchall()を実行する必要があります –

答えて

0

データベースの変数名を変更する必要があるので、それらに ' - '文字が含まれていないことを確認してください。 変数にはpythonによって予約された文字を含めることはできません。たとえば、ハイフン( - )、感嘆符(!)、コロン(:)などは使用しないでください。

this answerによれば、変数名には唯一の文字はアンダースコア(_)のようです。

1

pyodbcはpyodbc.Rowオブジェクトの値を、row.column_nameという形式で参照できます。ただし、列名は合法的なPython識別子です。ですから、例えば、私たちは「都市」列の値を印刷する

row = crsr.fetchone() 
print(row.city) 

ような何かを行うことができます。残念ながら、私たちが使用して、「私の-NR」列の値を印刷しようとするのでmy-nrは、法的なPythonの識別子が... ...

row = crsr.fetchone() 
print(row.my-nr) # error 

ではありませんPythonはそれが「row.myマイナスnr」としてどこrow.myを解析し、 Rowオブジェクト内の列として解釈され、nrはPython変数として解釈されます。私たちは、列名のリストをつかむ辞書に行の値を使用してそれらの名前をマージして、辞書内の値を参照することができ、問題を回避するには

crsr.execute(sql) 
col_names = [x[0] for x in crsr.description] 

row = crsr.fetchone() 
row_as_dict = dict(zip(col_names, row)) 
print(row_as_dict['my-nr']) # no error 
2

最も簡単な私が考えることができるソリューションはこれです。最初に、ハイフンを含む列をOpenEdge(see here)で引用する必要があります。次に、有効なPython属性として参照できるように列のエイリアスを設定できます。あなたはこのような何かをする必要があります:

cursor.execute('select "my-nr" as mynr, "my-dt-my" as mydtmy from mytable') 
row = cursor.fetchone() 
print(row.mynr, row.mydtmy) 

幸運!

関連する問題