在column名包含连字符(-)时,使用pyodbc引用行值的方法

2024-05-23 18:58:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我不熟悉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” 未定义名称“my”

我想这和点后面的负号有关。印刷品(行。我的-编号:,行。我的-dt车型年款)

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

有什么办法把这些行打印出来吗?在


Tags: 代码名称数据库executemywindowsdtselect
3条回答

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

根据this answer的说法,在变量名中下划线(U)似乎是唯一允许的字符。在

我能想到的最简单的解决办法就是这样。首先,包含连字符的列需要在OpenEdge(see here)中引用。其次,可以对列进行别名,以便它们可以作为有效的Python属性引用。你需要这样做:

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标识符。例如,我们可以做一些类似的事情

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

打印“城市”列的值。不幸的是,my-nr不是一个合法的Python标识符,所以如果我们试图使用。。。在

^{pr2}$

。。。Python将其解析为“row.mynr”,其中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

相关问题 更多 >