【问题标题】:How to check if a column exists, if it does, return a value from it如何检查列是否存在,如果存在,则从中返回一个值
【发布时间】:2017-04-24 14:52:31
【问题描述】:

在 psycopg2 中,如果我有一张桌子:

+------+-----+-------+  
| name | age | color |  
+------+-----+-------+  
| Bob  |  25 | red   |  
| Bill |  50 | blue  |  
| Jane |  45 | black |  
+------+-----+-------+

如果我这样做cursor.execute("SELECT * FROM mySchema.this_table LIMIT 1") 然后我检查颜色是否存在: colnames = [desc[0] for desc in cursor.description] 然后在 colnames 中搜索“color”

然后我想我得到了这一行: myrow = importCursor.fetchone()

但是如何获得该行的“颜色”值? 我试过color = importCursor.fetchone()['color'] 但这不起作用。

如何获取该 SELECT 语句返回的行的颜色值?我不知道表中有多少列,或者“颜色”列是否始终是第 3 列我必须为此表中的一堆列执行此操作(检查是否存在,如果存在,则返回列行的值)所以一个有效的方法是最好的!

【问题讨论】:

  • cursor.execute('select color from myschema.this_table limit 1'), color = cursor.fetchall()

标签: python sql postgresql cursor psycopg2


【解决方案1】:

只选择一些列

如果您只选择某些列,那么您确实知道列顺序。

cursor.execute("SELECT name, age, color FROM mySchema.this_table LIMIT 1")

现在您知道第 0 列是 name,第 1 列是 age,第 2 列是 color。所以你可以用myrow[1]之类的东西来选择哪一个。

先获取列图

您可以获取返回列的映射,然后使用它来确定从哪里获取。

column_names = [desc[0] for desc in cursor.description]
if 'color' in column_names:
    color = cursor.fetchOne()[column_names.index('color')]

这样应该还是比较高效的,因为查询后只需要计算一次列名列表,然后就可以通过indexin等简单的列表操作将列名映射到列号,这比再次访问数据库要快得多。

【讨论】:

  • 丹,感谢您的回复。不过,这对我来说不太适用,因为我并不总是肯定该专栏的存在。所以首先我实际上是在做一个select *,然后使用cursor.description 来搜索列名。然后如果我找到它,我需要检查它的价值。
  • @Acoustic77 查看更新后的答案。我添加了一种获取列名映射的方法,然后使用它来确定要捕获的列(仅当列存在时)。希望这更符合你所追求的......
猜你喜欢
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
  • 2016-01-18
  • 2017-11-17
  • 2011-12-26
  • 2018-04-10
  • 1970-01-01
  • 2020-02-20
相关资源
最近更新 更多