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

use*_*827 8 python postgresql dataset

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()
Run Code Online (Sandbox Code Playgroud)

我使用此代码访问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()
Run Code Online (Sandbox Code Playgroud)

特别是,我想100%确定一旦完成这段代码就没有与postgres数据库的连接.哪个是实现它的更好方法?选项1还是选项2?

PRM*_*reu 6

目前,主要问题是选项2(带语句)中使用的上下文管理器不处理连接,只处理事务(块末尾的提交/回滚).

(这个问题已经报告给Github回购,也许行为会改变?)

所以,你应该更换db.commit()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
Run Code Online (Sandbox Code Playgroud)

现在连接已关闭:

# db['name_table'].all() ==> throws an error due to closed connection
Run Code Online (Sandbox Code Playgroud)

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

# db['new_table'] ==> enough to add a new table 
Run Code Online (Sandbox Code Playgroud)

所以你可能想破坏一切以防止这种情况(db = None,或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
Run Code Online (Sandbox Code Playgroud)

编辑:

(感谢IljaEverilä的评论,以及对文档的关注)

更好地调用meta = MetaData(connection)以便在引擎处理时关闭连接,这将在上面的示例中引发错误,连接IS关闭.