当列名称包含破折号(连字符)

问题描述 投票:0回答:2
我尝试从Progress OpenEdge数据库中从表中打印第一个A行。 (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” 未定义的名字“my'

我猜想这与减去符号有关。在印刷中(row.my-nr,row.my-dt-my)

很容易从数据库中打印出表名称和列名,但由于某种原因,打印行更难。

任何想法如何打印行?

PyodBC允许我们使用表单

pyodbc.Row
python pyodbc openedge
2个回答
11
投票
row.column_name

对象中引用值,但前提是列名是合法的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

或我们可以简单地使用

__getattribute__()

row = crsr.fetchone()
print(row.__getattribute__("my-nr"))


我能想到的最简单的解决方案就是这个。首先,需要在OpenEdge中引用包含连字符的列(在此处查看)。其次,您可以别名这些列,因此可以将其引用为有效的Python属性。您需要做这样的事情:

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

6
投票
运气好!

我相信您需要更改数据库的可变名称,请确保它们不包含任何“ - ”字符。 变量不能包含Python保留的字符。例如,您必须避免连字符( - ),感叹号(!),结肠(:)等。

According thisAnders
似乎下划线(_)是可变名称中唯一允许的字符。
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.