2012-03-08 14 views
3

は、私は次のコードSQL錬金術なしトランザクション開始エラー

db = create_engine('sqlite:///tracking_test.db') 
db.echo= True 
metadata = MetaData(db) 
session = create_session(bind=db) 
#define tables, if they exist sqlalchemly will find them and sycn otherwise they will be created 
delivered= Table('delivered', metadata, 
    Column('delivered_id',Integer,primary_key=True), 
    Column('domain',String(200)), 
    Column('path',String(500)), 
    ) 

class Delivered(object):   
    def __init__(self,obj): 
     self.domain=u'%s' % obj.get("dm","") 
     self.path=u'%s' % obj.get("pth","") 


report1t = Table('clicked', metadata, 
    Column('clicked_id',Integer,primary_key=True), 
    Column('domain',String(200)), 
    Column('path',String(500)), 

) 

class report1(object): 
    def __init__(self,obj): 
     self.domain=u'%s' % obj.get("dm","") 
     self.path=u'%s' % obj.get("pth","") 


metadata.create_all() 
mapper(report1, report1t) 
mapper(Delivered,delivered) 
result= {}#some dict 
newT = Delivered(result) 
if newT: 
    session.add(newT) 
    session.commit() 
    session.flush() 

を実行して、私はこのエラー sqlalchemy.exc.InvalidRequestError取得:いいえ取引が開始されていないが。

セッション辞書は言う:

{'autocommit': True, 'autoflush': False, 'transaction': None, 'hash_key': 4317750544, 'expire_on_commit': False, '_new': {<sqlalchemy.orm.state.InstanceState object at 0x101a79ad0>: <__main__.adDelivered object at 0x101a799d0>}, 'bind': Engine(sqlite:///adtracking_test.db), '_deleted': {}, '_flushing': False, 'identity_map': {}, 'dispatch': <sqlalchemy.event.SessionEventsDispatch object at 0x101a82f90>, '_enable_transaction_accounting': True, '_identity_cls': <class 'sqlalchemy.orm.identity.WeakInstanceDict'>, 'twophase': False, '_Session__binds': {}, '_query_cls': <class 'sqlalchemy.orm.query.Query'>} 

いずれは私が間違っているのか知っていますか?あなたが完全なトレースバックを投稿した場合

おかげで、 CG

答えて

4

それは役立つだろう。しかし、問題はあなたがセッションを作成する方法にあると私は思う。私はあなたがcreate_sessionではなくsessionmakerを使用しているべきだと考えています(以前はその機能を見たことがなく、どこにも記載されていません)。 sessionmakerは新しいSessionクラスを作成します。このクラスはインスタンス化する必要があります。だから:

Session = sessionmaker(bind=db) 
session = Session() 
... 
session.add(newT) 
+0

これは、トリックを行うように見えた、私は創造を発見したか分からない。 –

+0

ありがとうaquavitae :) –

関連する問題