Вывод базы данных PostgreSQL в Treeview tkinter. Поиск аналогии row_factory sqlite3 в PostgreSQL + psycopg2
Вопрос у меня состоит в следующем: существовал проект с базой данных реализованной на sqlite3 и интерфейсом на tkinter с выводом базы данных в интерфейс через Treeview. В последствии база была заменена на PostgreSQL, соответственно вывод данных сломался, так как в sqlite3 данные получали в виде объекта через:
row_factory = sqlite3.Row
И впоследствии к ним обращались по именам таблицы:
i['id'] # и т.д. ...
Возможно-ли сохранить тот же принцип работы в базе PostgreSQL через библиотеку psycopg2? Пример функций из sqlite3:
def get_data():
all_data = []
with sqlite3.connect('db/database.db') as db:
db.row_factory = sqlite3.Row
cursor = db.cursor()
query = """ SELECT * FROM Table_name """
cursor.execute(query)
all_data = cursor
return all_data
def get_table_data():
data = get_data()
return [(i['id'], i['name'], i['city']) for i in data]
Далее все данные уходили в вывод дисплея:
import helper as eh # helper - это файл где как раз хранятся функции по работе с БД
heads = ['id', 'name', 'city']
style = ttk.Style(window)
style.configure(Treeview, row height=40)
table=ttk.Treeview(block_name, show='headings', selectmode='browse')
table['columns'] = heads
for header in heads:
table.heading(header, text=header, anchor='center')
table.column(header, anchor='center') # опускаю декоративные выставления размеров и т.д.
for row in eh.get_table_data():
table.insert('', tk.END, values=row)
Новая функция получения данных из PostgreSQL:
def get_data():
all_data = []
with psycopg2.connect(dbname="dbname", user="user", password="password", host="host") as conn:
with conn.cursor() as cursor:
cursor.execute(""" SELECT * FROM schema_name."Table_name" ; """)
rows = cursor.fetchall()
all_data = rows
return all_data
Ну и разумеется, что данный результат новой функции не впишется в get_table_data так как мы получим кортежи. Из данного сочинения и вытекает вопрос есть ли аналог row_factory в psycopg2, чтобы была фозможность обращаться к столбцам по имени и выводить результат так же в строковом типе, либо может есть способ как выводить результат PostgreSQL в Treeview? Заранее спасибо, может просто туплю и тут всё просто будет (тогда камнями не кидайтесь).
Ответы (1 шт):
Нашёл такое решение:
def get_table_data():
data = get_data()
result = []
for i in data:
result.append(" ".join(map(str, i)))
return result
Не самое идеальное, так как обращение идёт не к столбцам, а следствие - косячный вывод даты и времени может быть.