Я думаю, что пытался просить слишком много в моем предыдущем вопросе , поэтому извиняюсь за это. Позвольте мне изложить мою ситуацию настолько просто, насколько я могу на этот раз.
По сути, у меня есть несколько словарей, которые ссылаются на мои объекты, которые в свою очередь отображаются с использованием SQLAlchemy. Все хорошо со мной. Тем не менее, я хочу внести итерационные изменения в содержание этих словарей. Проблема заключается в том, что при этом будут изменены объекты, на которые они ссылаются - и использование copy.copy () не принесет пользы, поскольку оно только копирует ссылки, содержащиеся в словаре. Таким образом, даже если что-то скопировать, при попытке сказать print
содержимое словаря я получу только последние обновленные значения для объекта.
Вот почему я хотел использовать copy.deepcopy (), но это не работает с SQLAlchemy. Сейчас передо мной стоит дилемма, так как мне нужно скопировать определенные атрибуты моего объекта, прежде чем делать итеративные изменения.
Итак, мне нужно одновременно использовать SQLAlchemy и , чтобы при внесении изменений у меня была копия атрибутов моего объекта, чтобы я не менял сам ссылочный объект.
Любые советы, помощь, предложения и т.д.?
Edit:
Добавлен код.
class Student(object):
def __init__(self, sid, name, allocated_proj_ref, allocated_rank):
self.sid = sid
self.name = name
self.allocated_proj_ref = None
self.allocated_rank = None
students_table = Table('studs', metadata,
Column('sid', Integer, primary_key=True),
Column('name', String),
Column('allocated_proj_ref', Integer, ForeignKey('projs.proj_id')),
Column('allocated_rank', Integer)
)
mapper(Student, students_table, properties={'proj' : relation(Project)})
students = {}
students[sid] = Student(sid, name, allocated_project, allocated_rank)
Таким образом, атрибуты, которые я буду изменять, это атрибуты allocated_proj_ref
и allocated_rank
. students_table
вводится с использованием уникального идентификатора студента (sid
).
Question
Я бы хотел сохранить атрибуты, которые я изменил выше - я имею в виду, именно поэтому я решил использовать SQLA. Однако сопоставленный объект будет меняться, что не рекомендуется. Таким образом, если я внесу изменения в doppelgänger, unmapped object ... могу ли я принять эти изменения и обновить поля / таблицу для mapped object.
В некотором смысле я следую за вторичным решением Дэвида , где я создаю другую версию Класса, которая не отображается.
Я пытался использовать решение StudentDBRecord
, упомянутое ниже, но получил ошибку!
File "Main.py", line 25, in <module>
prefsTableFile = 'Database/prefs-table.txt')
File "/XXXX/DataReader.py", line 158, in readData
readProjectsFile(projectsFile)
File "/XXXX/DataReader.py", line 66, in readProjectsFile
supervisors[ee_id] = Supervisor(ee_id, name, original_quota, loading_limit)
File "<string>", line 4, in __init__
raise exc.UnmappedClassError(class_)
sqlalchemy.orm.exc.UnmappedClassError: Class 'ProjectParties.Student' is not mapped
Означает ли это, что Student
должен быть сопоставленным?
Health warning!
Кто-то указал на действительно хорошую дополнительную проблему здесь. Понимаете, даже если я вызываю copy.deepcopy()
для не отображенного объекта, в этом случае, давайте предположим, что это словарь учеников, который я определил выше, deepcopy делает копию everything . Мой allocated_proj_ref
на самом деле является Project
объектом, и у меня есть соответствующий projects
словарь для этого.
Поэтому я делаю глубокие копии как students
, так и projects
- что я и есть - он говорит, что у меня будут случаи, когда у атрибута students
allocated_proj_ref
будут проблемы с соответствием экземплярам в projects
словарь.
Таким образом, я понимаю, что мне придётся переопределить / переопределить (это так называется, не так ли?) deepcopy
в каждом классе, используя def __deecopy__(self, memo):
или что-то в этом роде?
Я бы хотел переопределить __deepcopy__
, чтобы он игнорировал все компоненты SQLA (которые являются <class 'sqlalchemy.util.symbol'>
и <class 'sqlalchemy.orm.state.InstanceState'>
), но копировал все остальное, что является частью сопоставленного класса.
Есть предложения, пожалуйста?