【问题标题】:Referencing row values in pyodbc when column name contains dashes (hyphens)当列名包含破折号(连字符)时在 pyodbc 中引用行值
【发布时间】:2018-05-07 08:35:28
【问题描述】:

我是 python 和 pyodbc 的新手

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

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

这给出了错误 undefined name: 'nr' 未定义的名称“dt” 未定义名称“我的”

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

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

任何想法如何打印行?

【问题讨论】:

  • 如果你想要超过 1 行,我认为你应该 fetchall()

标签: python pyodbc openedge


【解决方案1】:

pyodbc 允许我们使用 row.column_name 形式引用 pyodbc.Row 对象中的值,前提是列名是合法的 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 将被解释为 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

【讨论】:

  • 这是一个非常好的实现,并且用途广泛,足以满足许多场景。此外,这种方法得到了我的投票,因为它不需要我返回并重命名我的列以对 python 更友好。我知道如果一个人只使用少数几列,那么重命名这些列可能会更快;我倾向于一次使用 20-50 列,这意味着回去重命名它们本身就是一项任务。
【解决方案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)

祝你好运!

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多