当列名称包含破折号(连字符)时,请参考PYODBC中的行值



我是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标识符,因此,如果我们尝试使用...

打印" my-nr"列的值
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保留的字符。例如,您必须避免连字符( - ),感叹号(!),结肠(:)等。

根据此答案,似乎下划线(_)是可变名称中唯一允许的字符。

相关内容

  • 没有找到相关文章

最新更新