我正在尝试使用 Jupyter 笔记本中的 SQLAlchemy 在 MySQL 中创建临时表或删除表。 SQL 函数确实创建表或删除表,但会导致错误
ResourceClosedError:此结果对象不返回行。已经自动关闭了。
如果按预期执行操作,是否有办法抑制错误?
这是我的代码:
import pandas as pd
from sqlalchemy import create_engine
# Connect to the MySQL database
engine = create_engine('mysql+pymysql://root:pwd@localhost/bikestore')
# Get tables list as a DataFrame
tables = pd.read_sql("SHOW TABLES", engine)
# Print the table names
print(tables)
pd.read_sql("CREATE TEMPORARY TABLE customer_orders AS SELECT x.*, y.order_status, z.item_id, z.product_id, z.quantity, z.list_price, z.discount, (quantity*list_price) as sale FROM bikestore.customers x LEFT JOIN bikestore.orders y on x.customer_id = y.customer_id LEFT JOIN bikestore.order_items z on y.order_id = z.order_id",engine)
pd.read_sql("DROP TABLE customer_orders", engine)
我希望 SQL 查询能够按照规定工作,因为它们在 MySQL Workbench 上运行良好。不知道如何避免该错误。
这里的问题是
CREATE TEMPORARY TABLE … AS SELECT …
不返回结果集,尽管事实上那里有 SELECT
。您需要创建表,然后从中读取。
更复杂的是,临时表的持续时间与创建它的数据库会话(连接)一样长。因此,您需要确保对涉及临时表的所有操作使用相同的连接。
with engine.begin() as conn:
create = """\
CREATE TEMPORARY TABLE zzz_temp AS
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'mydb'
"""
conn.exec_driver_sql(create)
df = pd.read_sql_query("SELECT * FROM zzz_temp", conn) # use conn, not engine
#
# do the rest of your work with the DataFrame
print("Done.")