以下是我一般基于SQLAlchemy的数据库访问类的结构。有烧瓶包装器API,使用它们。
在这种结构下,我遇到了很多不同类型的异常。具体来说:
Web服务“ X”使用功能fooBar。如果此服务同时接听多个电话,我将收到以下异常:
文件“ C:\ Python27 \ lib \ site-packages \ sqlalchemy \ engine \ base.py”,第1631行,在提交中 引发exc.InvalidRequestError(“此交易无效”) InvalidRequestError:此交易无效
我也在以下之间随机获得以下内容:
ProgrammingError:(pyodbc.ProgrammingError)('24000','[24000] [Microsoft] [SQL Server Native Client 11.0]无效的光标状态(0)(SQLFetch)')
更不用说发生了数次僵局和回滚。
我感觉到我建立连接的方式可能有问题。似乎所有请求都使用了相同的连接。
如果有人能指出此代码结构的错误之处,并且也欢迎对此提出任何其他一般性评论,我们将不胜感激。
class DBHandler:
def init(self):
try:
self.engine = create_engine(SQLALCHEMY_DATABASE_URI, connect_args={'connect_timeout': 10000}, echo=True)
self.connection = self.engine.connect()
except:
print 'Not connecting to AWS Database'
def foo(self, skuID):
try:
transaction = self.connection.begin()
query = "Update Master_SKU SET SKU_Stage = '3' WHERE SKU_ID = ?"
results = self.connection.execute(query,skuID)
transaction.commit()
return True
except:
transaction.rollback()
return None
def fooBar(self):
try:
transaction = self.connection.begin()
query = "SELECT * FROM Master_SKU"
results = self.connection.execute(query)
transaction.commit()
return True
except:
transaction.rollback()
return None
编辑:
替代方法:
这有意义吗?
def fooBar(self):
try:
tempConnection = self.engine.connect()
transaction = tempConnection.begin()
query = "SELECT * FROM Master_SKU"
rows = tempConnection.execute(query).fetchall()
transaction.commit()
return True
except:
transaction.rollback()
return False
答案 0 :(得分:1)
您打开连接太早(self.connection = self.engine.connect()
)。
至此,您已经打开了连接,但没有对其进行任何操作。
可能发生的情况是数据库为您打开了一个连接并创建了一个锁。在关闭它之前,您无法执行其他交易(例如UPDATE
)。例如在PostgreSQL中,这种情况经常发生。试试这个习惯用法:
connection = self.engine.connect()
# ... perform work
connection.close()
另外,请参见相关问题:python sqlalchemy + postgresql program freezes。