如何以正确的方式复制 SQLAlchemy 映射的对象?
How to duplicate an SQLAlchemy-mapped object the correct way?
我想复制(copy)一个由SQLAlchemy 映射的对象。它应该只复制我创建的数据,而不是所有底层的东西。它不应复制主键或唯一值。
这在创建与上一个只有一点点不同的新数据条目时很有用。因此用户不必再次输入所有数据。
一个重要的要求是当table中的列名(例如name
)和成员名称(例如_name
) 中的 python class 不一样.
此(简化)代码适用于所有 declarative_base() 派生的 classes,但仅当 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
是 table 中列的名称。当 python class 中的成员名称不同时,这将不起作用。我不知道 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
).
上有人
It’s not a generalized solution for the whole world, though. It doesn’t take into account columns that are part of unique Index objects or columns that are mentioned in standalone UniqueConstraint objects.
但是因为 SQLA-docu(对我来说!)很难阅读和理解,所以我不太确定该代码中发生了什么 - 特别是在 for
- 构造中。 items()
后面是什么,为什么会有两个参数(name
、col
)?
我想复制(copy)一个由SQLAlchemy 映射的对象。它应该只复制我创建的数据,而不是所有底层的东西。它不应复制主键或唯一值。
这在创建与上一个只有一点点不同的新数据条目时很有用。因此用户不必再次输入所有数据。
一个重要的要求是当table中的列名(例如name
)和成员名称(例如_name
) 中的 python class 不一样.
此(简化)代码适用于所有 declarative_base() 派生的 classes,但仅当 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
是 table 中列的名称。当 python class 中的成员名称不同时,这将不起作用。我不知道 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
).
It’s not a generalized solution for the whole world, though. It doesn’t take into account columns that are part of unique Index objects or columns that are mentioned in standalone UniqueConstraint objects.
但是因为 SQLA-docu(对我来说!)很难阅读和理解,所以我不太确定该代码中发生了什么 - 特别是在 for
- 构造中。 items()
后面是什么,为什么会有两个参数(name
、col
)?