SQLAlchemy Connections,pooling和SQLite

时间:2009-09-02 22:57:29

标签: sqlite sqlalchemy

所以,我的设计为每个“项目”调用了一个单独的SQLite文件。我正在仔细阅读SQLAlchemy Pooling文档。我现在的猜测是,我根本不想愚弄汇集,但是这个实际上是每个项目的独立连接引擎。同意??

在这种情况下,当我创建引擎时,要么连接到按约定命名的文件,要么创建新的SQLite文件并提供模式模板...... ??

2 个答案:

答案 0 :(得分:2)

嗯,什么?连接池包含许多到同一(数据库)服务器的连接。建立新连接需要时间,因此当使用相同的数据库许多短期进程时,拥有已建立的连接池非常方便。进程可以检查连接,执行操作并返回它,而无需等待打开新连接。

在任何情况下,所有连接都转到同一个数据库,由传递给create_engine

的URI给出

答案 1 :(得分:1)

首先,一些词汇。 SQLAlchemy使用 MetaData 对象定义模式,包含表示表和其他数据库实体的对象。元数据对象可以可选地“绑定”到引擎,这就是您所认为的“池”。

要创建标准架构并在多个数据库中使用它,您需要创建一个元数据对象,并将其与多个引擎一起使用,每个引擎都是一个数据库你连接到。这是一个例子,来自交互式iPython提示。请注意,每个SQLite引擎都连接到不同的内存数据库; connection1和connection2不连接到同一个数据库:

In [1]: from sqlalchemy import *
In [2]: metadata = MetaData()
In [3]: users_table = Table('users', metadata,
   ...:                     Column('id', Integer, primary_key=True),
   ...:                     Column('name', String))
In [4]: connection1 = create_engine('sqlite:///:memory:')
In [5]: connection2 = create_engine('sqlite:///:memory:')

In [6]: ## Create necessary tables
In [7]: metadata.create_all(bind=connection1)
In [8]: metadata.create_all(bind=connection2)

In [9]: ## Insert data
In [10]: connection1.execute(
             users_table.insert(values={'name': 'Mike'}, bind=connection1))
In [11]: connection2.execute(
             users_table.insert(values={'name': 'Jim'}, bind=connection2))

In [12]: print connection1.execute(users_table.select(bind=connection1)).fetchall()
[(1, u'Mike')]

In [13]: print connection2.execute(users_table.select(bind=connection2)).fetchall()
[(1, u'Jim')]

如您所见,我使用存储在 metedata 对象中的公共架构连接到两个sqlite数据库并在每个数据库上执行语句。如果我是你,我首先使用create_engine方法,而不用担心汇集。在进行优化时,您可以使用create_engine的参数来调整数据库的连接方式。