Peq*_*que 7 python sqlalchemy pandas
使用Pandas,我可以非常轻松地将数据库中的数据读入数据帧:
from sqlalchemy import create_engine
import pandas
query = 'SELECT * FROM Table_Name;'
engine = create_engine('...')
df = pandas.read_sql_query(query, engine)
print(df.head())
Run Code Online (Sandbox Code Playgroud)
我想确保在执行.read_sql_query()后没有保持连接打开,无论查询成功还是引发异常都无关紧要.
我目前:
poolclass=NullPool.engine.disponse().像这样:
from sqlalchemy import create_engine
from sqlalchemy.pool import NullPool
import pandas
def get_data():
query = 'SELECT * FROM Table_Name;'
try:
engine = create_engine('...', poolclass=NullPool)
df = pandas.read_sql_query(query, engine)
finally:
engine.dispose()
return df
print(get_data().head())
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
当使用sqlalchemy与熊猫read_sql_query(query, con)方法,将创建一个SQLDatabase对象与属性connectable来self.connectable.execute(query).并且只要它是(即和)的实例就SQLDatabase.connectable被初始化.consqlalchemy.engine.ConnectableEngineConnection
Engine对象传递为con就像你问题中的示例代码一样:
from sqlalchemy import create_engine
import pandas as pd
engine = create_engine('...')
df = pd.read_sql_query(query, con=engine)
Run Code Online (Sandbox Code Playgroud)
在内部,大熊猫只是使用result = engine.execute(query),这意味着:
在上面,该
execute()方法Connection自己获取一个新的,用该对象执行语句,并返回ResultProxy.在这种情况下,ResultProxy包含一个称为的特殊标志close_with_result,表示当其基础DBAPI游标关闭时,Connection对象本身也会关闭,这又会返回DBAPI连接到连接池,从而释放事务资源.
在这种情况下,您不必担心Connection自动关闭,但它会保留连接池engine.
因此,您可以使用以下命令禁用池:
engine = create_engine('...', poolclass=NullPool)
Run Code Online (Sandbox Code Playgroud)
或者dispose发动机完全engine.dispose()在最后.
但是遵循引擎处理文档(最后一段),这两个是替代方案,您不必同时使用它们.所以在这种情况下,对于简单的一次性使用read_sql_query和清理,我认为这应该足够了:
# Clean up entirely after every query.
engine = create_engine('...')
df = pd.read_sql_query(query, con=engine)
engine.dispose()
Run Code Online (Sandbox Code Playgroud)
Connection对象时con:connection = engine.connect()
print(connection.closed) # False
df = pd.read_sql_query(query, con=connection)
print(connection.closed) # False again
# do_something_else(connection)
connection.close()
print(connection.closed) # True
engine.dispose()
Run Code Online (Sandbox Code Playgroud)
每当您想要更好地控制连接的属性,关闭连接等时,都应该这样做.例如,一个非常重要的例子是a
Transaction,它允许您决定何时将更改提交到数据库.(从这个答案)
但是对于pandas,我们内部没有控制权read_sql_query,唯一有用的connection是它允许你在明确关闭之前做更多有用的事情.
我想我想使用以下模式,这使我能够更好地控制连接并留下未来的可扩展性:
engine = create_engine('...')
# Context manager makes sure the `Connection` is closed safely and implicitly
with engine.connect() as conn:
df = pd.read_sql_query(query, conn)
print(conn.in_transaction()) # False
# do_something_with(conn)
trans = conn.begin()
print(conn.in_transaction()) # True
# do_whatever_with(trans)
print(conn.closed) # False
print('Is Connection with-OUT closed?', conn.closed) # True
engine.dispose()
Run Code Online (Sandbox Code Playgroud)
但是对于简单的用例,例如您的示例代码,我认为清理DB IO资源的方法同样简洁且简单.
| 归档时间: |
|
| 查看次数: |
2016 次 |
| 最近记录: |