我是python和pyodbc
的新手我尝试从Progress OpenEdge数据库中从表中打印第一个行。(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)
很容易从数据库中打印出表名称和列名,但由于某种原因打印行更难。
有什么想法如何打印行?
pyodbc允许我们使用 row.column_name
表格在 pyodbc.Row
对象中引用值,前提是列名是合法的python标识符。因此,例如,我们可以做
row = crsr.fetchone()
print(row.city)
打印"城市"列的价值。不幸的是,my-nr
不是合法的python标识符,因此,如果我们尝试使用...
row = crsr.fetchone()
print(row.my-nr) # error
... Python解析为" row.my
减去nr
",其中row.my
将解释为行对象中的列,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
我能想到的最简单的解决方案就是这样。首先,需要在OpenEdge中引用包含连字符的列(请参见此处)。其次,您可以别名这些列,因此可以将其引用为有效的Python属性。您需要做这样的事情:
cursor.execute('select "my-nr" as mynr, "my-dt-my" as mydtmy from mytable')
row = cursor.fetchone()
print(row.mynr, row.mydtmy)
祝你好运!
我相信您需要更改数据库的变量名称,请确保它们不包含任何' - '字符。变量不能包含Python保留的字符。例如,您必须避免连字符( - ),感叹号(!),结肠(:)等。
根据此答案,似乎下划线(_)是可变名称中唯一允许的字符。