关于python:当列名包含破折号(连字符)时,在pyodbc中引用行值

Referencing row values in pyodbc when column name contains dashes (hyphens)

我不熟悉python和pyodbc

我尝试从进度OpenEdge数据库的表中打印第一行。(Windows 7)以下是未运行的代码块:

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

这会导致错误未定义的名称:"nr"未定义的名称'dt'未定义的名称'my'

我想这和点后面的负号有关。打印中(MY-Nr行,MY-DY行)

以前很容易从数据库中打印出表名和列名,但由于某些原因,打印出行比较困难。

你知道如何打印这些行吗?


我能想到的最简单的解决办法就是这个。首先,包含连字符的列需要在OpenEdge中引用(请参见此处)。第二,可以对列进行别名,以便将它们作为有效的python属性引用。您需要这样做:

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

祝你好运!


pyodbc允许我们使用row.column_name的形式引用pyodbc.Row对象中的值,前提是列名是合法的python标识符。例如,我们可以做

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

打印"城市"列的值。不幸的是,my-nr不是合法的python标识符,所以如果我们尝试使用…

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

…python将其解析为"row.my减去nr",其中row.my将被解释为行对象中的列,nr将被解释为python变量。

为了解决这个问题,我们可以获取列名列表,将这些名称与行值合并到字典中,然后引用字典中的值:

1
2
3
4
5
6
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


我认为您需要更改数据库的变量名,确保它们不包含任何"-"字符。变量不能包含python保留的字符。例如,必须避免使用连字符(-)和感叹号(!),冒号(:)等。

根据这个答案,似乎下划线(u)是变量名中唯一允许的字符。