Воссоздать какой-нибудь объект sqlalchemy - PullRequest
0 голосов
/ 30 августа 2011

Хорошо, у меня тут небольшая проблема.Мне нужно иметь возможность создавать своего рода функции импорта / экспорта для некоторых sqlalchemy.Теперь это не объекты, которые я определяю, поэтому, чтобы получить столбцы, которые я делаю:

for attr, value in res.__class__.__dict__.iteritems():
     if isinstance(value, InstrumentedAttribute):
          data = eval("res." + str(attr))
          param_dict[attr] = data

Теперь это правильно возвращает мне атрибуты этого объекта.Однако я не могу быть уверен, что параметры init одинаковы, так как я не тот, кто обрабатывает эти объекты.Так что может быть такая ситуация:

class SomeClass(model.Base):
    my_column = Column(String)
    ....some other stuff...

    def __init__(self, mycolumn, ...):
           self.my_column = mycolumn

Так что в этом случае у меня нет никакого соответствия между именем поля и именем параметра, полученным init.В настоящее время я противопоставляю тех, кто определяет эти классы, чтобы все параметры init имели значение по умолчанию, поэтому я мог бы просто:

obj = SomeClass()
exec "obj." + attr + " = " + param[attr]

Однако я бы хотел уйти даже из этого ограниченияЕсть ли способ, которым я могу достичь этого?

1 Ответ

4 голосов
/ 04 сентября 2011

Сериализация на самом деле не может быть обобщена для всех возможных классов, сопоставленных с sqlalchemy, классы могут иметь свойства, которые не хранятся в базе данных, или которые должны выводиться на нескольких уровнях косвенного обращения через свойства relationship. Короче говоря, только вы знаете, как сериализовать определенный класс для конкретного использования.


Предположим, что вам нужны значения столбцов или заботятся о них только для конкретного экземпляра рассматриваемого конкретного класса (в res). Вот грубая функция, которая будет возвращать dict, содержащий только эти значения.

from sqlalchemy.orm.attributes import manager_of_class
from sqlalchemy.orm.properties import ColumnProperty

def get_state_dict(instance):
    cls = type(instance)
    mgr = manager_of_class(cls)
    return dict((key, getattr(instance, key))
                for key, attr in mgr.iteritems()
                if isinstance(attr.property, ColumnProperty))

и воссоздать экземпляр из диктата *

def create_from_state_dict(cls, state_dict):
    mgr = manager_of_class(cls)
    instance = mgr.new_instance()
    for key, value in state_dict.iteritems():
        setattr(instance, key, value)
    return instance

Если вам нужно что-то более сложное, возможно, для обработки отношений, не показанных в виде столбцов (как в отношениях «многие ко многим»), вы, вероятно, можете добавить этот случай, выполнив поиск sqlalchemy.orm.properties.RelationshipProperty, а затем перебрав коллекцию. 1015 *

* Сериализация промежуточного слова и класса оставлена ​​в качестве упражнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...