В (python3) psycopg2 возвращает результаты в виде строки, а не dict

#python-3.x #postgresql #psycopg2

#python-3.x #postgresql #psycopg2

Вопрос:

В psycopg2 есть ли способ для курсора возвращать результаты в виде строки, а не в формате JSON (или string), а не в виде объекта dictionary?

Пример

 # connect to database 
conn = psycopg2.connect(host=host, port=port, user=usr, password=passwd, dbname=dbn) 
cur = conn.cursor(cursor_factory=RealDictCursor)
# CREATE table and INSERT 
cur.execute("CREATE TABLE t1(c char, i int);")
cur.execute("INSERT INTO t1(c, i) VALUES ('a', 1), ('b', 2), ('c', 3)"); 
# Execute query 
cur.execute("SELECT COUNT(*) FROM t1;") 
output1 = cur.fetchall() 
cur.execute("SELECT * FROM t1;")
output2 = cur.fetchall()
  

Ожидать — Список объектов, отформатированных в виде JSON или строк

 output1 - ['{"count": 3}']
output2 - ['{"c": "a", "i": 1}', '{"c": "b", "i": 2}', '{"c": "c", "i": 3}']
  

Фактический — Список объектов словаря

 output1 - [{'count': 3}]
output2 - [{'c': 'a', 'i': 1}, {'c': 'b', 'i': 2}, {'c': 'c', 'i': 3}]
  

В настоящее время я использую модуль JSON для преобразования каждого объекта в JSON, но мне интересно, есть ли более простой способ (т. Е. внутри psycopg2).

Комментарии:

1. output1 = json.dumps(cur.fetchall()) недостаточно просто?

2. @klin, я привел простой пример, но реальная ситуация содержит объекты datetime.datetime, поэтому, если я использую ваш метод, я получаю ошибку. Это означает, что для использования функции json я должен обновить список, а затем преобразовать JSON…

Ответ №1:

Ваш текущий способ отображения вашего представления в вашем приложении правильный, и вы должны продолжать это делать.

В принципе, есть способ отобразить ваше представление в формате JSON внутри PostgreSQL, но делать это не имело бы никакого смысла, поскольку визуализация ваших представлений — это самое большее, что вы можете получить от того, какую роль база данных будет играть в вашей архитектуре.

Комментарии:

1. И, кстати, @OShadmon, я хочу поблагодарить вас за то, что вы воспользовались советом по архитектуре. Способность видеть собственные ментальные конструкции с разных и конфликтующих точек зрения — это то, что отличает мужчин от мальчиков и женщин от девочек.