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

时间:2017-11-23 11:28:06

标签: 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)

这会给出错误未定义的名称:' nr' 未定义的名称' dt' 未定义的名称'我的'

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

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

如何打印行?

3 个答案:

答案 0 :(得分:2)

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

的事情
row = crsr.fetchone()
print(row.city)

打印" city"的价值柱。不幸的是,my-nr不是合法的Python标识符,因此如果我们尝试打印" my-nr"列使用...

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

... 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

答案 1 :(得分:2)

我能想到的最简单的解决方案就是这个。首先,需要在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)
祝你好运!

答案 2 :(得分:0)

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

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