使用 pandas 创建临时表

问题描述 投票:0回答:1

我正在尝试使用 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 上运行良好。不知道如何避免该错误。

pandas sqlalchemy create-table pymysql
1个回答
0
投票

这里的问题是

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.")
© www.soinside.com 2019 - 2024. All rights reserved.