Python中提取元组文本/转换元组列表,解决PostgreSQL连接报错
问题解决方法
核心问题是cursor.fetchall()返回的每一行是元组(哪怕只查询一个字段),你直接把元组存入列表,导致后续使用时带了元组格式(比如('postgres',)),数据库自然找不到这个名称的库。
1. 修正数据库名称列表的获取
把第一个代码块的循环改成提取元组的第一个元素:
sql = '''select datname from pg_database; ''' cursor.execute(sql) dbs=[] for dbase in cursor.fetchall(): # 取元组的第一个元素存入列表,得到纯字符串的库名 dbs.append(dbase[0]) conn.commit() conn.close() print(dbs) # 现在输出是 ['postgres', 'your_db', ...] 格式的字符串列表 clicked = StringVar() clicked.set(dbs[0]) db_choice = OptionMenu(row1,clicked,*dbs)
这样dbs里存的是纯字符串数据库名,clicked.get()得到的就是正常的库名(比如postgres),用它连接数据库就不会报错。
2. 修正表名称列表的获取
第二个代码块同理,若后续要使用表名,同样需要提取元组的第一个元素:
conn = psycopg2.connect( host="localhost", database=clicked.get(), user="postgres", password="Testuser12") print('Connecting to the PostgreSQL database...') cursor = conn.cursor() cursor.execute("""SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'""") db_tables = [] for table in cursor.fetchall(): print(table[0]) # 打印纯表名字符串 db_tables.append(table[0]) # 存入纯表名字符串
关于之前的转换错误
你尝试把元组转普通列表时出错,大概率是错误处理了元组(比如用元组当作列表索引)。正确的做法不是把元组转成列表,而是直接提取元组内的字符串元素存入列表,这样得到的是纯字符串列表,后续操作不会有类型问题。
内容的提问来源于stack exchange,提问作者Shakalll
相关产品推荐
相关产品推荐

