我想我试着要求太多了
my previous question
为此道歉。这次让我以尽可能简单的方式阐述我的处境。
基本上,我有一堆引用我的对象的字典,它们依次使用sqlAlchemy映射。我没事。但是,我想对那些字典的内容进行迭代更改。问题是这样做会改变它们引用的对象---并且使用copy.copy()没有什么好处,因为它只复制字典中包含的引用。因此,即使复制了一些东西,当我试图,说
print
字典的内容,我将只获取对象的最新更新值。
这就是为什么我想使用copy.deepcopy(),但这不适用于sqlacalchemy。现在我陷入了困境,因为我需要在进行上述迭代更改之前复制对象的某些属性。
总之,我需要使用sqlacalchemy
和
同时,确保在进行更改时可以复制对象属性,这样就不会更改引用的对象本身。
有什么建议、帮助、建议等吗?
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
使用唯一的学生ID键入(
sid
)
Question
我想保留上面更改的属性——我的意思是,这就是我决定使用sqla的基本原因。但是,映射对象将更改,这是不推荐的。因此,如果我对Doppelg_anger进行更改,
未映射的
对象…我能接受这些更改并更新
映射
对象。
从某种意义上说,我是跟随大卫的
secondary solution
在这里我创建了另一个未映射的类版本。
我试过用
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复制了
一切
. 我的
分配的项目参考
实际上是
Project
对象,我有一个对应的
projects
字典。
所以我把两者都复制了
students
和
项目
--我是——他说我会有
学生
的
分配的项目参考
属性与中的实例匹配时将出现问题
项目
字典。
因此,我认为我必须重新定义/重写(这就是它所称的,不是吗?)
deepcopy
在每个类中使用
def __deecopy__(self, memo):
或者类似的?
我想重写一下
__deepcopy__
这样它就忽略了所有的sqla内容(即
<class 'sqlalchemy.util.symbol'>
和
<class 'sqlalchemy.orm.state.InstanceState'>
)但复制属于映射类的所有其他内容。
有什么建议吗?