2017-02-10 50 views
1

我有一个简单的Web服务,它使用SQLAlchemy的使用模式使用SQLAlchemy与引擎/连接而不是会话是线程安全的吗?

engine = create_engine(database_uri) 
connection = engine.connect() 

在服务的每个端点连接到数据库,然后我使用相同的连接,以下列方式:

for result in connection.execute(query): 
    <do something fancy> 

由于Session不是线程安全的,恐怕connection也不是。

我可以安全地继续这样做吗?如果没有,解决它的最简单方法是什么?

小问题 - 我不知道该服务是否会运行多线程,但我宁愿确保它不会遇到麻烦。

+0

我没有你的问题的答案,但我想问一个问题作为回报:你真的需要一个ORM吗?我知道这是一个个人选择的问题,但是......如果你的数据甚至是远程清理,你可以使用pyodbc并使用游标,它很可能会更好,并有更清晰的implimentation。 – Kelvin

+0

我不认为任何人都必须使用ORM。在这种情况下,由于数据库不断变化,我(个人)碰巧变得更容易。一些查询非常复杂,对我来说更明显(再次,个人),他们使用sqlalchemy是正确的 - SQL非常冗长。 – Clearer

+1

好吧。 +1有一个很好的理由使用它:) – Kelvin

回答

1

简答:你应该没问题。

connectionSession之间的差异。简短的描述是连接表示连接到数据库的连接。您传递给它的信息将非常简单。它不会跟踪你的交易,除非你告诉它,它不会关心你发送数据的顺序。因此,如果在创建Sprocket对象之前创建Widget对象很重要,那么最好在线程安全的上下文中调用它。如果您想跟踪数据库事务,通常也是如此。

Session另一方面,为您跟踪数据和交易。如果你使用check out the source code,你会注意到数据库事务的来回,并且没有办法知道你在事务中拥有了所有你想要的东西,你最终可以在一个线程中提交,而你希望能够在另一个中添加另一个对象(或几个)。


如果你不知道交易是什么this is Wikipedia,但短期的版本是,交易有助于确保您的数据保持稳定。如果您有15个插入和更新,并且插入15个失败,您可能不想创建另一个14.一个事务将允许您批量取消整个操作。

+0

我只是从服务器读取数据,而不是写作;我想我应该是安全的。 – Clearer

+2

@Clearer该文档明确指出['Connection'对象不是线程安全的](http://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.Connection)。基础DBAPI连接是否是线程安全的取决于特定的驱动程序。 – univerio

+0

@univerio我可以通过调用connection.connect()并使用返回值来解决这个问题吗?据我所知,这应该是安全的。 – Clearer