【问题标题】:How to duplicate an SQLAlchemy-mapped object the correct way?如何以正确的方式复制 SQLAlchemy 映射的对象?
【发布时间】:2015-03-13 18:40:19
【问题描述】:

我想复制(复制)一个由 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】:
    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-mailinglistmentioned

    不过,这并不是适用于全世界的通用解决方案。它不考虑属于唯一 Index 对象的列或独立 UniqueConstraint 对象中提到的列。

    但是因为 SQLA 文档(对我来说!)很难阅读和理解,我不太确定该代码中发生了什么——尤其是在 for-construct 中。 items()背后是什么,为什么会有两个参数(namecol)?

    【讨论】:

    • 最后一个问题不是 SQLAlchemy 问题,而是一个非常基本的 Python 问题。 mapper.columns 是一个映射(dictdict -like),items() 返回一个包含所有键/值对作为元组的迭代。在forin 之间,您可以在作业的左侧写下任何合法的内容。这包括用于元组/序列解包的多个名称。
    猜你喜欢
    • 2012-05-17
    • 2013-02-08
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2021-08-23
    • 2019-03-13
    相关资源
    最近更新 更多