如何以正确的方式复制SQLAlchemy映射的对象?

问题描述 投票:4回答:1

我想复制(复制)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如何知道此连接?我该如何处理?

python sqlalchemy
1个回答
0
投票
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()后面是什么?为什么有两个参数(namecol)?

© www.soinside.com 2019 - 2024. All rights reserved.