使用 python 数据集访问和关闭 postgres 数据库的最佳方法

2024-02-13

import dataset    
from sqlalchemy.pool import NullPool

db = dataset.connect(path_database, engine_kwargs={'poolclass': NullPool})

table_f1 = db['name_table']
# Do operations on table_f1

db.commit()
db.executable.close()

我使用此代码来访问 postgres 数据库,有时还会对其进行写入。最后,我关闭它。上面的代码是访问和关闭它的最佳方法吗?或者,下面的代码更好吗?

import dataset    
from sqlalchemy.pool import NullPool

with dataset.connect(path_database, engine_kwargs={'poolclass': NullPool}) as db:
    table_f1 = db['name_table']
    # Do operations on table_f1

    db.commit()

特别是,我想 100% 确定一旦这段代码完成,就不会连接到 postgres 数据库。哪种方法可以更好地实现它?选项 1 还是选项 2?


目前,主要问题是选项 2 中使用的上下文管理器(有声明) 不处理连接,仅处理交易 https://github.com/pudo/dataset/blob/master/dataset/persistence/database.py#L123(在块末尾提交/回滚)。

(这个问题已经反馈给Github 仓库 https://github.com/pudo/dataset/issues/211,也许行为会改变?)

所以你应该更换db.commit() by db.executable.close()在选项 2 中:

import dataset    
from sqlalchemy.pool import NullPool

with dataset.connect(path_database, engine_kwargs={'poolclass': NullPool}) as db:
    table_f1 = db['name_table']
    print(db.local.conn.closed) # >>>False

    # Do operations on table_f1
    # end of the context manager, trying to commit 

db.executable.close()
print(db.local.conn.closed) # >>>True

现在连接已关闭:

# db['name_table'].all() ==> throws an error due to closed connection

但是...您仍然可以在数据库中创建新表(因为元数据?):

# db['new_table'] ==> enough to add a new table 

所以你可能想毁掉一切来防止这种情况发生(db = None, or db.metadata = None)


最后一个行为也发生在 SQLAlchemy 中:

from sqlalchemy import *
from sqlalchemy.pool import NullPool

engine = create_engine('postgresql:///datatest', poolclass=NullPool) 

connection = engine.connect()
meta = MetaData(engine)
t1 = Table('Table_1', meta,
           Column('id', Integer, primary_key=True),
           Column('name',String))
t1.create()
connection.close()

t2 = Table('Table_2', meta,
           Column('id', Integer, primary_key=True),
           Column('name',String))
t2.create()
# table_2 is created in database

EDIT:

(感谢 Ilja Everilä 的评论,并重点关注the doc http://docs.sqlalchemy.org/en/latest/core/connections.html#engine-disposal)

最好打电话meta = MetaData(connection)为了关闭引擎处置的连接,这将在上面的示例中引发错误,连接已关闭。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 python 数据集访问和关闭 postgres 数据库的最佳方法 的相关文章

随机推荐