使用 psycopg2 从 python 中的元组中提取字符串
Extract string from a Tuple in python with psycopg2
我在 python 中编写了一个 web.py 服务来访问 PostGres 并获取特定数据库中的 table 名称。
代码:
def GET(self,r):
web.header('Access-Control-Allow-Origin', '*')
web.header('Access-Control-Allow-Credentials', 'true')
tables = []
datasetID = web.input().dataSetID
cursor = conn.cursor()
cursor.execute("select relname from pg_class where relkind='r' and relname !~ '^(pg_|sql_)';")
tablesWithDetails = cursor.fetchall()
print tablesWithDetails
for x in tablesWithDetails:
x.replace("(", "")
x.replace(")","")
tables.append(x)
print tables;
这将打印 table 如下,
[('acam_datasegregationdetails',), ('acam_datasegregationheader',), ('idn_accessinformation',), ('idn_b2cuseraccountmapping',), ('idn_b2cuserdevicemapping',), ('idn_b2cusers',), ('idn_roles',), ('idn_useraccountmapping')]
需要输出:
['acam_datasegregationdetails', 'acam_datasegregationheader', idn_accessinformation', 'idn_b2cuseraccountmapping', 'idn_b2cuserdevicemapping', 'idn_b2cusers', 'idn_roles', 'idn_useraccountmapping']
问题出在这段代码
tables.append(x)
当你执行cursor.fetchall()
你会得到一个元组列表
当您执行 for x in tablesWithDetails:
时,您将通过 one tuple at a time
遍历列表
因此,当您执行 tables.append(x)
时,您是将单个元素元组附加到列表中
要更改,您可以这样做 tables.append(x[0])
它附加元组的第一个元素
放弃那个循环,改为做
tables = [t[0] for t in tablesWithDetails]
它将构建一个列表,其中包含结果集中每个元组的第一个元素。
或者更简单(更便宜),如果你想要一个列表,那么 return 一个数组,它将被 Psycopg 改编为列表:
cursor.execute("""
select array_agg(relname)
from pg_class
where relkind='r' and relname !~ '^(pg_|sql_)';"
""")
tables = cursor.fetchall()[0][0]
我在 python 中编写了一个 web.py 服务来访问 PostGres 并获取特定数据库中的 table 名称。
代码:
def GET(self,r):
web.header('Access-Control-Allow-Origin', '*')
web.header('Access-Control-Allow-Credentials', 'true')
tables = []
datasetID = web.input().dataSetID
cursor = conn.cursor()
cursor.execute("select relname from pg_class where relkind='r' and relname !~ '^(pg_|sql_)';")
tablesWithDetails = cursor.fetchall()
print tablesWithDetails
for x in tablesWithDetails:
x.replace("(", "")
x.replace(")","")
tables.append(x)
print tables;
这将打印 table 如下,
[('acam_datasegregationdetails',), ('acam_datasegregationheader',), ('idn_accessinformation',), ('idn_b2cuseraccountmapping',), ('idn_b2cuserdevicemapping',), ('idn_b2cusers',), ('idn_roles',), ('idn_useraccountmapping')]
需要输出:
['acam_datasegregationdetails', 'acam_datasegregationheader', idn_accessinformation', 'idn_b2cuseraccountmapping', 'idn_b2cuserdevicemapping', 'idn_b2cusers', 'idn_roles', 'idn_useraccountmapping']
问题出在这段代码
tables.append(x)
当你执行cursor.fetchall()
你会得到一个元组列表
当您执行 for x in tablesWithDetails:
时,您将通过 one tuple at a time
因此,当您执行 tables.append(x)
时,您是将单个元素元组附加到列表中
要更改,您可以这样做 tables.append(x[0])
它附加元组的第一个元素
放弃那个循环,改为做
tables = [t[0] for t in tablesWithDetails]
它将构建一个列表,其中包含结果集中每个元组的第一个元素。
或者更简单(更便宜),如果你想要一个列表,那么 return 一个数组,它将被 Psycopg 改编为列表:
cursor.execute("""
select array_agg(relname)
from pg_class
where relkind='r' and relname !~ '^(pg_|sql_)';"
""")
tables = cursor.fetchall()[0][0]