当列名包含破折号(连字符)时引用 pyodbc 中的行值

BPH*_*BPH 5 python pyodbc openedge

我是 python 和 pyodbc 的新手

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

cursor.execute("select my-nr, my-dt-my from mytable")
row = cursor.fetchone()
print(row.my-nr, row.my-dt-my)
Run Code Online (Sandbox Code Playgroud)

这给出了错误 undefined name: 'nr' undefined name 'dt' undefined name 'my'

我猜这与点后面的减号有关。在打印(row.my-nr,row.my-dt-my)

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

任何想法如何打印行?

Gor*_*son 10

pyodbc 允许我们pyodbc.Row使用表单引用对象中的值row.column_name,前提是列名是合法的 Python 标识符。例如,我们可以做类似的事情

row = crsr.fetchone()
print(row.city)
Run Code Online (Sandbox Code Playgroud)

打印“城市”列的值。不幸的是,my-nr它不是合法的 Python 标识符,因此如果我们尝试使用...打印“my-nr”列的值

row = crsr.fetchone()
print(row.my-nr)  # error
Run Code Online (Sandbox Code Playgroud)

...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
Run Code Online (Sandbox Code Playgroud)


Fli*_*rPA 5

我能想到的最简单的解决方案是这个。首先,需要在 OpenEdge 中引用包含连字符的列(请参阅此处)。其次,您可以为列设置别名,以便将它们作为有效的 Python 属性进行引用。你需要做这样的事情:

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

祝你好运!