SQLAlchemy 没有事务开始错误
Posted
技术标签:
【中文标题】SQLAlchemy 没有事务开始错误【英文标题】:SQL Alchemy no transaction begun error 【发布时间】:2012-03-08 18:11:47 【问题描述】:我运行以下代码
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
【问题讨论】:
【参考方案1】:执行以下代码行中提到的提交时出现类似错误“没有开始事务”:
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
db_session.add(target)
db_session.commit()
就我而言,发生错误是因为我将自动提交设置为 True 并尝试提交()。要解决此问题,请将自动提交设置为 False,如下面的代码所示。
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
谢谢, 卡提克
【讨论】:
这是我的确切问题。谢谢。【参考方案2】:如果您发布完整的回溯会很有帮助。但是,我认为问题在于您创建会话的方式。我认为您应该使用sessionmaker
而不是create_session
(我以前从未见过该功能,而且我在任何地方都没有看到它的文档)。 sessionmaker
创建一个新的 Session
类,您需要对其进行实例化。所以:
Session = sessionmaker(bind=db)
session = Session()
...
session.add(newT)
【讨论】:
这似乎成功了,我不确定我在哪里找到了 createsession。以上是关于SQLAlchemy 没有事务开始错误的主要内容,如果未能解决你的问题,请参考以下文章