首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用make_transient()复制SQLAlchemy映射的对象?

如何使用make_transient()复制SQLAlchemy映射的对象?
EN

Stack Overflow用户
提问于 2015-05-17 12:51:04
回答 1查看 10.9K关注 0票数 12

我知道如何复制或复制SQLAlchemy映射对象的问题被问了很多次。答案总是取决于需要或如何解释“重复”或“复制”。这是一个专门的问题版本,因为我得到了使用make_transient()的技巧。

但我对此有一些意见。我真的不知道如何在这里处理主键(PK)。在我的用例中,PK总是由SQLA (或者后台的DB )自动生成的。但这种情况不会发生在一个新的复制对象上。

代码有点伪。

代码语言:javascript
复制
import sqlalchemy as sa
from sqlalchemy.orm.session import make_transient

_engine = sa.create_engine('postgres://...')
_session = sao.sessionmaker(bind=_engine)()


class MachineData(_Base):
    __tablename__ = 'Machine'    
    _oid = sa.Column('oid', sa.Integer, primary_key=True)


class TUnitData(_Base):
    __tablename__ = 'TUnit'
    _oid = sa.Column('oid', sa.Integer, primary_key=True)
    _machine_fk = sa.Column('machine', sa.Integer, sa.ForeignKey('Machine.oid'))
    _machine = sao.relationship("MachineData")

    def __str__(self):
        return '{}.{}: oid={}(hasIdentity={}) machine={}(fk={})' \
        .format(type(self), id(self),
                self._oid, has_identity(self),
                self._machine, self._machine_fk)


if __name__ == '__main__':
    # any query resulting in one persistent object
    obj = GetOneMachineDataFromDatabase()

    # there is a valid 'oid', has_identity == True
    print(obj)

    # should i call expunge() first?

    # remove the association with any session
    # and remove its “identity key”
    make_transient(obj)

    # 'oid' is still there but has_identity == False
    print(obj)

    # THIS causes an error because the 'oid' still exsits
    # and is not new auto-generated (what should happen in my
    # understandings)
    _session.add(obj)
    _session.commit()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-23 11:47:08

在使对象实例暂时化之后,您必须删除它的对象id。如果没有对象id,您可以再次将其添加到数据库中,数据库将为其生成一个新的对象id。

代码语言:javascript
复制
if __name__ == '__main__':
    # the persistent object with an identiy in the database
    obj = GetOneMachineDataFromDatabase()

    # make it transient
    make_transient(obj)
    # remove the identiy / object-id
    obj._oid = None
    # adding the object again generates a new identiy / object-id
    _session.add(obj)
    # this include a flush() and create a new primary key
    _session.commit()
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30287042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档