我想复制(复制)SQLAlchemy映射的对象。它应该只复制我创建的数据,而不是所有底层的东西。它不应复制主键或唯一值。
这在创建新数据条目时很有用,该数据条目与最后一个只有一点点不同。因此,用户不必再次输入所有数据。
[重要要求是当表中的列名称(例如name
)和python类中的成员名称(例如_name
)不同时需要执行的工作。
此(简化的)代码仅适用于所有declarative_base()派生类,但仅当col-name和member-name相同时。
import sqlalchemy as sa
def DuplicateObject(oldObj):
mapper = sa.inspect(type(oldObj))
newObj = type(oldObj)()
for col in mapper.columns:
# no PrimaryKey not Unique
if not col.primary_key and not col.unique:
setattr(newObj, col.key, getattr(oldObj, col.key))
return newObj
col.key
是表中列的名称。当python类中的成员名称不同时,将不起作用。我不知道SQLAlchemy如何将列名与成员名联系起来。 SQLA如何知道此连接?我该如何处理?
import sqlalchemy as sqa
def duplicate_object(old_obj):
# SQLAlchemy related data class?
if not isinstance(old_obj, _Base):
raise TypeError('The given parameter with type {} is not '
'mapped by SQLAlchemy.'.format(type(old_obj)))
mapper = sa.inspect(type(old_obj))
new_obj = type(old_obj)()
for name, col in mapper.columns.items():
# no PrimaryKey not Unique
if not col.primary_key and not col.unique:
setattr(new_obj, name, getattr(old_obj, name))
return new_obj
看起来像这项工作。即使成员以双下划线(__name
)开头。
但是SQLA-mailinglist mentioned上有人
不过,这不是针对全世界的通用解决方案。它不考虑作为唯一Index对象的一部分的列或独立的UniqueConstraint对象中提到的列。
但是因为(我!)SQLA-docu非常难以理解和理解,所以我不确定该代码中会发生什么,尤其是在for
构造中。 items()
后面是什么?为什么有两个参数(name
,col
)?