SQLAlchemy RowProxy для словаря [дубликат]

Рассмотрим код

  для i в диапазоне (10): print «Вы увидите это 10 раз», i  

Идея что вы получите список длины yx , который вы можете (как видите выше) перебирать.

Читайте в документы python для диапазона - они рассматривают for-loop итерацию первичную usecase.

164
задан Anurag Uniyal 11 September 2013 в 06:34
поделиться

28 ответов

В большинстве сценариев имя столбца подходит для них. Но, возможно, вы пишете код следующим образом:

class UserModel(BaseModel):
    user_id = Column("user_id", INT, primary_key=True)
    email = Column("user_email", STRING)

column.name «user_email», в то время как имя поля «email», column.name не может работать как раньше.

sqlalchemy_base_model.py

также пишу ответ здесь

112
ответ дан Community 15 August 2018 в 21:13
поделиться
  • 1
    Более кратко, return dict((col, getattr(row, col)) for col in row.__table__.columns.keys()). – argentpepper 30 March 2012 в 20:13
  • 2
    @argentpepper да, вы даже можете сделать row2dict = lambda row: dict((col, getattr(row, col)) for col in row.__table__.columns.keys()), чтобы сделать его настоящим одним лайнером, но я предпочитаю, чтобы мой код был читаемым, горизонтально коротким, вертикально длинным – Anurag Uniyal 30 March 2012 в 20:47
  • 3
    Что делать, если мой столбец не присваивается атрибуту с тем же именем? IE, x = Column('y', Integer, primary_key=True)? Ни одно из этих решений не работает в этом случае. – Buttons840 31 May 2012 в 21:46
  • 4
    Предупреждение: __table__.columns.keys() не будет работать, потому что словарные клавиши columns не всегда являются строками (как требуется getattr), но, возможно, всевозможные объекты, такие как sqlalchemy.sql.expression._truncated_label. Использование c.name вместо c работает для меня. – drdaeman 14 July 2012 в 18:49
  • 5
    drdaeman прав, вот правильный фрагмент: return {c.name: getattr(self, c.name) for c in self.__table__.columns} – charlax 9 August 2012 в 14:41
  • 6
    голосовать за расширение гибридного имущества – Yon 12 August 2015 в 04:04
113
ответ дан Community 5 September 2018 в 20:46
поделиться
117
ответ дан Community 29 October 2018 в 04:18
поделиться
for row in resultproxy:
    row_as_dict = dict(row)
44
ответ дан Alex Brasetvik 15 August 2018 в 21:13
поделиться
  • 1
    Он говорит: «XXX-объект не итерируется», я использую 0.5.6, я получаю session.query (Klass) .filter (). All () – Anurag Uniyal 24 December 2009 в 14:13
  • 2
    @Anurag Uniyal: Пожалуйста, обновите свой вопрос: (a) наименьшим фрагментом кода, который показывает проблему, и (б) реальной трассировкой ошибок. Это очень сложно сделать с помощью комментариев и резюме кода. – S.Lott 24 December 2009 в 14:47
  • 3
    Затем вы используете ORM, который полностью отличается от вашего фактического вопроса. Это довольно простая вещь, которая подробно описана в документации: sqlalchemy.org/docs/05/ormtutorial.html – Alex Brasetvik 24 December 2009 в 15:04
  • 4
    обратите внимание, что это правильный ответ для современных версий SQLAlchemy, предполагая «строка». это основной объект строки, а не экземпляр, сопоставленный ORM. – zzzeek 24 November 2014 в 18:46
  • 5
    Также обратите внимание, что zzzeek является создателем sqlalchemy. – chris 24 August 2016 в 18:32

строки имеют функцию _asdict(), которая дает dict

In [8]: r1 = db.session.query(Topic.name).first()

In [9]: r1
Out[9]: (u'blah')

In [10]: r1.name
Out[10]: u'blah'

In [11]: r1._asdict()
Out[11]: {'name': u'blah'}
24
ответ дан balki 15 August 2018 в 21:13
поделиться
  • 1
    Я задавался вопросом, почему это префикс. – boatcoder 24 April 2017 в 21:20
  • 2
    Он должен быть закрытым и не может быть удален / изменен в будущих версиях. – balki 3 May 2017 в 23:08
  • 3
    @balki Это достаточно хорошо документировано и как таковое не совсем личное. Хотя главный подчеркивание имеет этот смысл в Python вообще, здесь он, вероятно, используется для того, чтобы не столкнуться с возможными ключами кортежа. – Ilja Everilä 17 August 2017 в 08:59
  • 4
    Это работает только с KeyedTuple s, которые возвращаются только при запросе определенных полей строки. т.е. .query (Topic.name) возвращает KeyedTuple, а .query (Topic) возвращает тему, у которой нет ._asdict () - Derp. просто увидели ответы STB ниже. – Chad Lowe 10 November 2017 в 20:50

Вы можете преобразовать объект sqlalchemy в такой словарь и вернуть его как json / dictionary.

Вспомогательные функции:

import json
from collections import OrderedDict


def asdict(self):
    result = OrderedDict()
    for key in self.__mapper__.c.keys():
        if getattr(self, key) is not None:
            result[key] = str(getattr(self, key))
        else:
            result[key] = getattr(self, key)
    return result


def to_array(all_vendors):
    v = [ ven.asdict() for ven in all_vendors ]
    return json.dumps(v) 

Функция драйвера:

def all_products():
    all_products = Products.query.all()
    return to_array(all_products)
3
ответ дан Chirag Vora 15 August 2018 в 21:13
поделиться

У меня есть вариант ответа Марко Мариани, выраженный в качестве декоратора. Основное отличие состоит в том, что он будет обрабатывать списки объектов, а также безопасно игнорировать некоторые другие типы возвращаемых значений (что очень полезно при написании тестов с использованием mocks):

@decorator
def to_dict(f, *args, **kwargs):
  result = f(*args, **kwargs)
  if is_iterable(result) and not is_dict(result):
    return map(asdict, result)

  return asdict(result)

def asdict(obj):
  return dict((col.name, getattr(obj, col.name))
              for col in class_mapper(obj.__class__).mapped_table.c)

def is_dict(obj):
  return isinstance(obj, dict)

def is_iterable(obj):
  return True if getattr(obj, '__iter__', False) else False
1
ответ дан Chris R 15 August 2018 в 21:13
поделиться

Выражение, которое вы повторяете, вычисляет список объектов модели , а не строк. Итак, правильное их использование:

for u in session.query(User).all():
    print u.id, u.name

Вам действительно нужно преобразовать их в dicts? Конечно, существует много способов, но тогда вам не нужна ORM-часть SQLAlchemy:

result = session.execute(User.__table__.select())
for row in result:
    print dict(row)

Обновление: посмотрите модуль sqlalchemy.orm.attributes. Он имеет набор функций для работы с состоянием объекта, который может быть вам полезен, особенно instance_dict().

7
ответ дан Denis Otkidach 15 August 2018 в 21:13
поделиться
  • 1
    Я хочу преобразовать их в dict, потому что какой-то другой код нуждается в данных как dict, и я хочу использовать общий путь, потому что я не буду знать, какие столбцы имеют объект модели – Anurag Uniyal 25 December 2009 в 06:56
  • 2
    и когда я получаю обращение к ним, у меня есть доступ к объектам модели, поэтому я не могу использовать session.execute и т. д. – Anurag Uniyal 25 December 2009 в 06:57

Вот как это делает Эликсир. Значение этого решения заключается в том, что оно позволяет рекурсивно включать в себя словарное представление отношений.

def to_dict(self, deep={}, exclude=[]):
    """Generate a JSON-style nested dict/list structure from an object."""
    col_prop_names = [p.key for p in self.mapper.iterate_properties \
                                  if isinstance(p, ColumnProperty)]
    data = dict([(name, getattr(self, name))
                 for name in col_prop_names if name not in exclude])
    for rname, rdeep in deep.iteritems():
        dbdata = getattr(self, rname)
        #FIXME: use attribute names (ie coltoprop) instead of column names
        fks = self.mapper.get_property(rname).remote_side
        exclude = [c.name for c in fks]
        if dbdata is None:
            data[rname] = None
        elif isinstance(dbdata, list):
            data[rname] = [o.to_dict(rdeep, exclude) for o in dbdata]
        else:
            data[rname] = dbdata.to_dict(rdeep, exclude)
    return data
2
ответ дан dequis 15 August 2018 в 21:13
поделиться
  • 1
    Ссылка мертва. В следующий раз скопируйте соответствующий код здесь. – Gus E 8 April 2015 в 17:22
  • 2
    В следующий раз. Если я правильно помню, функция была довольно длинной. – argentpepper 9 April 2015 в 18:05

Старый вопрос, но поскольку это первый результат для «sqlalchemy row to dict» в Google, он заслуживает лучшего ответа.

Объект RowProxy, возвращаемый SqlAlchemy, имеет метод items (): http://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.RowProxy.items

Он просто возвращает список (ключ, значение) кортежей , Поэтому можно преобразовать строку в dict, используя следующее:

В Python & lt; = 2.6:

rows = conn.execute(query)
list_of_dicts = [dict((key, value) for key, value in row.items()) for row in rows]

В Python> = 2.7:

rows = conn.execute(query)
list_of_dicts = [{key: value for (key, value) in row.items()} for row in rows]
12
ответ дан fgasparini 15 August 2018 в 21:13
поделиться
  • 1
    Вы можете просто сделать list_of_dicts = [dict(row.items()) for row in rows] – Markus Meskanen 7 November 2016 в 12:03
  • 2
    Одна ошибка заключается в том, что имена столбцов, которые SQLAlchemy использует в результирующем наборе, являются table_name_column_name, если вам нужны разные имена (например, только column_name), используйте метод .label. session.query( MyTable.column_name.label('column_name'), ... ) – Aneel 22 April 2018 в 02:01

Двумя способами:

1.

for row in session.execute(session.query(User).statement):
    print(dict(row))

2.

selected_columns = User.__table__.columns
rows = session.query(User).with_entities(*selected_columns).all()
for row in rows :
    print(row._asdict())
1
ответ дан FrostSigh 15 August 2018 в 21:13
поделиться

После ответа @balki, поскольку SQLAlchemy 0.8 вы можете использовать _asdict (), доступный для объектов KeyedTuple. Это дает довольно простой ответ на исходный вопрос. Просто измените в своем примере две последние строки (цикл for) для этого:

for u in session.query(User).all():
   print u._asdict()

Это работает, потому что в приведенном выше коде u является объектом типа class KeyedTuple , так как .all () возвращает список KeyedTuple. Поэтому он имеет метод _asdict () , который прекрасно возвращает u в качестве словаря.

WRT ответ by @STB: AFAIK, anikong, что .all () возвращает список KeypedTuple. Следовательно, вышеизложенное работает либо при указании столбца, либо в отсутствии, если вы имеете дело с результатом .all () применительно к объекту Query.

9
ответ дан jgbarah 15 August 2018 в 21:13
поделиться
  • 1
    Возможно, это было в прошлом, но SQLAlchemy v1.0 .all() возвращает список экземпляров User, поэтому это не работает. – RazerM 20 May 2016 в 15:42
  • 2
    @RazerM, извините, но я не понимаю, что вы имеете в виду. Цикл for должен точно прокручивать список экземпляров пользователя, преобразовывать их (u) в словари, а затем печатать их ... – jgbarah 25 May 2016 в 21:00
  • 3
    У экземпляров User нет метода _asdict. См. gist.github.com/RazerM/2eff51571b3c70e8aeecd303c2a2bc8d – RazerM 25 May 2016 в 21:08
  • 4
    Теперь я понял. Благодарю. Вместо KeyedTuple теперь .all () возвращает объекты User. Поэтому проблема для v1.0 (и, я полагаю, вверху) заключается в том, как получить словарь из объекта User. Спасибо за разъяснения. – jgbarah 28 May 2016 в 16:36

Решение, которое также работает с наследуемыми классами:

from itertools import chain
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()


class Mixin(object):
    def as_dict(self):
        tables = [base.__table__ for base in self.__class__.__bases__ if base not in [Base, Mixin]]
        tables.append(self.__table__)
        return {c.name: getattr(self, c.name) for c in chain.from_iterable([x.columns for x in tables])}
-1
ответ дан magne4000 15 August 2018 в 21:13
поделиться
  • 1
    Мой ответ с использованием системы контроля уже работает для наследования таблиц без необходимости проходить через все эти проблемы – RazerM 14 June 2016 в 14:07
  • 2
    Да, но он действительно работает и отвечает на вопрос, так почему же вниз? – magne4000 29 June 2016 в 06:59
  • 3
    Вы также используете имя столбца, которое может отличаться от имени атрибута. – RazerM 29 June 2016 в 07:09
  • 4
    Могут существовать другие, не декларативные базы без атрибута __table__, и этот код не учитывает такие. Это то, для чего предназначен модуль для проверки . – Piotr Dobrogost 6 February 2018 в 10:10
from sqlalchemy.orm import class_mapper

def asdict(obj):
    return dict((col.name, getattr(obj, col.name))
                for col in class_mapper(obj.__class__).mapped_table.c)
12
ответ дан Marco Mariani 15 August 2018 в 21:13
поделиться
  • 1
    Обратите внимание на разницу между local_table и mapped_table. Например, если вы применяете какое-то наследование таблицы в своем db (tbl_employees & gt; tbl_managers, tbl_employees & gt; tbl_staff), ваши сопоставленные классы должны будут отражать это (Менеджер (Сотрудник), Персонал (Сотрудник)). mapped_table.c даст вам имена столбцов как базовой таблицы, так и таблицы наследования. local_table дает вам имя вашей (наследующей) таблицы. – mike_e 13 July 2012 в 22:49
  • 2
    Это позволяет избежать поля «_sa_instance_state», по крайней мере, в версии 0.8+. – Evan Siroky 15 August 2013 в 21:22
  • 3
    Этот ответ делает недопустимое предположение: имена столбцов не обязательно совпадают с именами атрибутов. – RazerM 20 May 2016 в 15:53

Я нашел этот пост, потому что искал способ преобразования строки SQLAlchemy в dict. Я использую SqlSoup ... но ответ был построен сам, поэтому, если он может помочь кому-то, вот мои два цента:

a = db.execute('select * from acquisizioni_motes')
b = a.fetchall()
c = b[0]

# and now, finally...
dict(zip(c.keys(), c.values()))
7
ответ дан Mychot sad 15 August 2018 в 21:13
поделиться
  • 1
    или, если вы предпочитаете ..: [dict (zip (i.keys (), i.values ​​())) для i в b] – Mychot sad 4 August 2012 в 17:38
  • 2
    Это единственный синтаксис, который я нашел, который действительно работает! Я пробовал вещи больше часа. – slashdottir 10 July 2015 в 20:24
  • 3
    Для выбора ядра, RowProxy (c в этом ответе) придерживается протокола сопоставления, поэтому вы можете просто вызвать dict(c). – RazerM 20 May 2016 в 15:56

Обратитесь к Ответу от Alex Brasetvik , вы можете использовать одну строку кода для решения проблемы

row_as_dict = [dict(row) for row in resultproxy]

. В разделе комментариев ответа Алекса Брасетвика zzzeek создатель SQLAlchemy заявила, что это «правильный метод» для проблемы.

5
ответ дан NorWay 15 August 2018 в 21:13
поделиться
  • 1
    @Greenonline Конечно, комментарий одобрения находится под ответом Алекса Брасетвика. Отредактировано добавление ссылки на его ответ – NorWay 4 July 2017 в 07:14

У меня нет большого опыта в этом, но, похоже, работает то, что я делаю:

dict(row)

Это кажется слишком простым (по сравнению с другими ответами здесь). Что мне не хватает?

-2
ответ дан Ralph Case 15 August 2018 в 21:13
поделиться
  • 1
    Если вы утверждаете, что ваш простой ответ работает, вы должны предоставить доказательства. Я думаю, вы используете основной выбор; этот вопрос касается запросов ORM. – RazerM 20 May 2016 в 15:38
  • 2
    Да. Я не заметил, что этот вопрос касается ORM. Я использую ядро. – Ralph Case 25 May 2016 в 17:19
  • 3
    Я пытался выяснить, как работать с RowProxy, и был расстроен документацией SQLAlchemy , в которой говорится: «В основном следует» упорядоченное словосочетание «поведение». Я не мог найти, что означает «Mostly», но я обнаружил, что не могу установить значения, например row['ultimate answer'] = 42. Просто использование dict() не сохраняет порядок столбцов, но следующее выглядит следующим образом: d = OrderedDict ( ) # Добавьте каждый элемент в порядок. для k, v в row.items (): d.update ({k: v}) – Ralph Case 25 May 2016 в 17:36

Это правильный ответ для современной SQLAlchemy (v0.8 - v1.2 +).


Использовать систему проверки .

from sqlalchemy import inspect

def object_as_dict(obj):
    return {c.key: getattr(obj, c.key)
            for c in inspect(obj).mapper.column_attrs}

user = session.query(User).first()

d = object_as_dict(user)

Обратите внимание, что .key - это имя атрибута, которое может отличаться от имени столбца, например в следующем случае:

class_ = Column('class', Text)

Этот метод также работает для column_property .

52
ответ дан RazerM 15 August 2018 в 21:13
поделиться
  • 1
    Что такое "современный" имею в виду? – Duke Dougal 11 September 2016 в 06:33
  • 2
    @DukeDougal Я думаю, что это работает с v0.8 (когда была добавлена ​​система проверки). – RazerM 11 September 2016 в 13:01
  • 3
    Это работает с Sqlalchemy v2.0. Других ответов нет. – Nguyen Thanh 31 May 2017 в 02:54
  • 4
    Это не учитывает отложенные столбцы – Mark 4 December 2017 в 00:35
  • 5
    @Mark Мне не ясно, что они должны быть исключены по умолчанию. Тем не менее, вы можете проверить, что ключи не находятся в sqlalchemy.inspect(obj).unloaded – RazerM 4 December 2017 в 10:05

как @balki:

Метод _asdict() можно использовать, если вы запрашиваете определенное поле, потому что оно возвращается как KeyedTuple .

In [1]: foo = db.session.query(Topic.name).first()
In [2]: foo._asdict()
Out[2]: {'name': u'blah'}

Принимая во внимание, что если вы не укажете столбец, вы можете использовать один из других предлагаемых методов - например, тот, который предоставляется @charlax. Обратите внимание, что этот метод действителен только для 2.7 +.

In [1]: foo = db.session.query(Topic).first()
In [2]: {x.name: getattr(foo, x.name) for x in foo.__table__.columns}
Out[2]: {'name': u'blah'}
13
ответ дан Sam Bourne 15 August 2018 в 21:13
поделиться
  • 1
    Если атрибуты класса ORM класса python имеют разные имена из столбцов базы данных, попробуйте это решение: stackoverflow.com/questions/27947294/… – TaiwanGrapefruitTea 14 January 2015 в 17:05
  • 2
    на самом деле, лучшее решение для всех случаев предоставляется автором sqlalchemy в stackoverflow.com/a/27948279/1023033 – TaiwanGrapefruitTea 14 January 2015 в 18:15
  • 3
    Когда я пытаюсь это сделать, я получаю объект ResultProxy не имеет атрибута '_asdict' – slashdottir 10 July 2015 в 20:17
  • 4
    @slashdottir, вы выполняете свой объект запроса (вызывая метод .first())? – Sam Bourne 5 July 2016 в 18:57
  • 5
    Этот ответ делает недопустимое предположение: имена столбцов не обязательно соответствуют именам атрибутов - см. Ответ RazerM. – Piotr Dobrogost 6 February 2018 в 10:46

Мой прием с использованием (слишком много?) словарей:

def serialize(_query):
#d = dictionary written to per row
#D = dictionary d is written to each time, then reset
#Master = dictionary of dictionaries; the id Key (int, unique from database) from D is used as the Key for the dictionary D entry in Master
Master = {}
D = {}
x = 0
for u in _query:
    d = u.__dict__
    D = {}
    for n in d.keys():
        if n != '_sa_instance_state':
            D[n] = d[n]
    x = d['id']
    Master[x] = D
return Master

Работа с флягой (включая jsonify) и flask_sqlalchemy для вывода на печать в виде JSON.

Вызвать функцию с помощью jsonify (serialize ()).

Работает со всеми запросами SQLAlchemy, которые я пробовал до сих пор (работает SQLite3)

-3
ответ дан Sawyer Brooks 15 August 2018 в 21:13
поделиться
  • 1
    Нет необходимости полагаться на словарь классов, пытаясь отфильтровать не столбцы вручную, когда существует система проверки SQLAlchemy. – RazerM 14 June 2016 в 13:59
class User(object):
    def to_dict(self):
        return dict([(k, getattr(self, k)) for k in self.__dict__.keys() if not k.startswith("_")])

Это должно работать.

0
ответ дан Singletoned 15 August 2018 в 21:13
поделиться
  • 1
    что произойдет, если имя столбца начинается с & lt; _ & quot; ? – Anurag Uniyal 11 February 2010 в 16:54
  • 2
    Я бы предположил, что вы действительно не должны называть свои столбцы ведущим подчеркиванием. Если вы это сделаете, это не сработает. Если это просто странный, о котором вы знаете, вы можете изменить его, чтобы добавить эти столбцы. – Singletoned 13 February 2010 в 00:29

Я новый программируемый программист на Python и столкнулся с проблемами, связанными с JSON с добавленными таблицами. Используя информацию из ответов здесь, я построил функцию, чтобы возвращать разумные результаты JSON, где включены имена таблиц, избегая наличия псевдонима или поля сталкиваются.

Просто передайте результат запроса сеанса:

test = Session (). query (VMInfo, Customer) .join (Customer) .order_by (VMInfo.vm_name) .limit (50) .offset (10)

json = sqlAl2json ( тест)

def sqlAl2json(self, result):
    arr = []
    for rs in result.all():
        proc = []
        try:
            iterator = iter(rs)
        except TypeError:
            proc.append(rs)
        else:
            for t in rs:
                proc.append(t)

        dict = {}
        for p in proc:
            tname = type(p).__name__
            for d in dir(p):
                if d.startswith('_') | d.startswith('metadata'):
                    pass
                else:
                    key = '%s_%s' %(tname, d)
                    dict[key] = getattr(p, d)
        arr.append(dict)
    return json.dumps(arr)
0
ответ дан tknightowl 15 August 2018 в 21:13
поделиться

Вот супер простой способ сделать это

row2dict = lambda r: dict(r.items())
-2
ответ дан user2444711 15 August 2018 в 21:13
поделиться

С помощью этого кода вы также можете добавить к вашему запросу «фильтр» или «присоединиться» и эту работу!

query = session.query(User)
def query_to_dict(query):
        def _create_dict(r):
            return {c.get('name'): getattr(r, c.get('name')) for c in query.column_descriptions}

    return [_create_dict(r) for r in query]
2
ответ дан Yakir Tsuberi 15 August 2018 в 21:13
поделиться

Обновление 2018-03-25:

Вы больше не можете использовать u.__dict__, поскольку он интерпретирует его как ссылку на столбец / поле. Вместо этого используйте dict(u).


Исходный ответ:

Вы можете получить доступ к внутреннему __dict__ объекта SQLAlchemy, например следующему ::

for u in session.query(User).all():
    print u.__dict__
157
ответ дан ZuluDeltaNiner 15 August 2018 в 21:13
поделиться
  • 1
    Лучший ответ в этой теме, не знаю, почему все остальные предлагают гораздо более сложные решения. – Dave Rawks 15 June 2012 в 16:45
  • 2
    Спасибо приятель. Простое решение требует больше усилий, чем сложное решение. Думаю, до тех пор, пока он решает проблему, большинству людей все равно. – hllau 16 June 2012 в 06:07
  • 3
    Это дает дополнительное поле «_sa_instance_state», по крайней мере, в версии 0.7.9. – elbear 29 October 2012 в 15:04
  • 4
    jberger, это не имя столбца, поэтому вам нужно удалить его отдельно после этого. – elbear 27 September 2013 в 15:26
  • 5
    поэтому было бы лучше: dictret = dict(row.__dict__); dictret.pop('_sa_instance_state', None) – lyfing 5 November 2014 в 09:39
  • 6
    – kilgoretrout 30 July 2016 в 20:44

, если столбец таблицы моделей не является эквивалентным столбцом mysql.

, например:

class People:
    id: int = Column(name='id', type_=Integer, primary_key=True)
    createdTime: datetime = Column(name='create_time', type_=TIMESTAMP,
                               nullable=False,
                               server_default=text("CURRENT_TIMESTAMP"),
                               default=func.now())
    modifiedTime: datetime = Column(name='modify_time', type_=TIMESTAMP,
                                server_default=text("CURRENT_TIMESTAMP"),
                                default=func.now())

Необходимо использовать:

 from sqlalchemy.orm import class_mapper 
 def asDict(self):
        return {x.key: getattr(self, x.key, None) for x in
            class_mapper(Application).iterate_properties}

, если вы используйте этот способ, вы можете получить change_time, а create_time - None

{'id': 1, 'create_time': None, 'modify_time': None}


    def to_dict(self):
        return {c.name: getattr(self, c.name, None)
         for c in self.__table__.columns}

Поскольку имя атрибута класса не совпадает с хранилищем столбцов в mysql

0
ответ дан 张小诚 15 August 2018 в 21:13
поделиться
1
ответ дан J.B. 29 October 2018 в 04:18
поделиться
0
ответ дан Eds_k 29 October 2018 в 04:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: