2016-03-31 13 views
1

Başlığın da belirttiği gibi.Bir nesnenin mülkünde başka bir nesneyi nasıl sqlalchemy içinde işlemek?

İşte kodlar.

from sqlalchemy import Column, ForeignKey, Integer, String, DateTime, func, Boolean 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import relationship 
from sqlalchemy.orm import sessionmaker 
from sqlalchemy.orm import scoped_session 
from sqlalchemy import create_engine 
import sqlalchemy.exc 
from sqlalchemy import event 
from settings import DB_HOST 

def return_a_scoped_session(): 
    engine = create_engine(DB_HOST) 
    session_factory = sessionmaker(bind=engine) 
    db_session = scoped_session(session_factory) 
    return db_session() 

Base = declarative_base() 


class MyClass(Base): 
    """Doc string for MyClass""" 
    __tablename__ = 'my_table' 
    file_name = Column(String(512), nullable=True) 


class Aria2Jobs(Base): 
    __tablename__ = 'nh_downloading_jobs' 
    id = Column(Integer, primary_key = True) 
    file_name = Column(String(512), nullable=True) 
    is_verified = Column(Boolean, default=False, nullable=True) 

    def check_if_verified(self): 
     if self.is_verified: 
      # create an instance 
      a_job= MyClass(file_name=self.file_name) 
      _session = return_a_scoped_session() 
      _session.add(a_job) 
      _session.commit() 
      _session.close() 

# event 
@event.listens_for(Aria2Jobs.is_verified, 'set') 
def send_to_jsonpyes_jobs(target, value, oldvalue, initiator): 
    target.check_if_verified() 

# error is when I set a property of an object (this property will trigger an event 'set' and the event will try to commit a session. 

session = return_a_scoped_session() 
row = session.query(Aria2Jobs).first() 
row.is_verified = True 
session.add(row) 

# the error came out 
# 
# sqlalchemy.exc.invalidrequesterror object is already attached to session 
session.commit() 

# How to commit another object in a property of an object? 

Bir nesnenin mülkünde başka bir nesneyi nasıl sqlalchemy içinde işlemek? Ben session.add(row) çalıştı

Gördüğünüz gibi,

hatası:

sqlalchemy.exc.invalidrequesterror object is already attached to session 

Ben row bağlı olan oturumun bilmiyorum. Ben fonksiyonu check_if_verified

çalıştırmak istediğiniz - En son hatası -

sqlalchemy.exc.InvalidRequestError: Object '<Aria2Jobs at 0x7fad3a635050>' is already attached to session '1' (this is 
+1

SQLAlchemy [ http://docs.sqlalchemy.org/en/latest/orm/session_basics.html#when-do-i-construct-a-session-when-do-i-commit-it-and-when 'e karşı açıkça önerir. -do-i-close-it) model sınıflarının oturumları gerçekleştirmesine izin verir. "Bu özel şeyi nasıl yapabilirim" diye sormak yerine, çözmeye çalıştığınız asıl sorunu bize bildirmeniz daha yararlı olabilir. – inklesspen

+0

Teşekkür ederim. SQLAlchemy kullanarak programlama yolunu değiştiriyorum. Ve bir çekicilik gibi çalışır. – dotslash

cevap

0

Sadece session.add(row) kaldırın. session.query kullansanız da, row nesnesi zaten oturumunuzdadır. Verileri kaydetmek için session.commit işlevini çalıştırmak için yeterlidir

0

scoped_session yanlış kullanıyorsunuz. Burada olan her şey, return_a_scoped_session() numaralı telefonu aradığınızda, tamamen yeni bir motorla yeni oturumunu döndürüyor. row başka bir oturuma başka bir yere ekleniyor. (Aslında, yayınlanan kod bile ilave ediliyor başka yerlerde göstermiyor; Sana yayınlanan koduyla hatayı yeniden olamaz.) Çözüm scoped_session düzeltmek için geçerli:

engine = create_engine(DB_HOST) 
Session = scoped_session(sessionmaker(bind=engine)) 

def return_a_scoped_session(): 
    return Session()