2015-05-17 5 views
6

मुझे पता है कि SQLAlchemy मैप किए गए ऑब्जेक्ट को डुप्लिकेट या कॉपी करने के लिए कितनी बार पूछा गया था। उत्तर हमेशा जरूरतों पर निर्भर करता है या कैसे "डुप्लिकेट" या "प्रतिलिपि" का अर्थ है। यह प्रश्न का एक विशेष संस्करण है क्योंकि मुझे इसके लिए make_transient() का उपयोग करने के लिए टिप मिली है।एकQQlchemy मैप किए गए ऑब्जेक्ट को डुप्लिकेट करने के लिए make_transient() का उपयोग कैसे करें?

लेकिन मुझे इसके साथ कुछ समस्याएं हैं। मुझे वास्तव में प्राथमिक कुंजी (पीके) को संभालने का तरीका नहीं पता है। मेरे उपयोग के मामलों में पीके हमेशा एसक्यूएलए (या पृष्ठभूमि में डीबी) द्वारा स्वत: उत्पन्न होता है। लेकिन यह एक नई डुप्लिकेट ऑब्जेक्ट के साथ नहीं होता है।

कोड थोड़ा सा छद्म है।

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() 
+0

कोई भी एक विचार है? – buhtz

उत्तर

4
if __name__ == '__main__': 
    obj = GetOneMachineDataFromDatabase() 

    make_transient(obj) 
    obj._oid = None 
    _session.add(obj) 
    # this include a flush() and create a new primary key 
    _session.commit() 
संबंधित मुद्दे