【问题标题】:Pandas read_sql metadata lockPandas read_sql 元数据锁
【发布时间】:2016-04-25 03:06:38
【问题描述】:

我正在使用 pandas 来读取 mysql 表。但是,通常在 read_sql 语句之后,我会在表上获得表锁。以下是查询,

mysql_cn= MySQLdb.connect(host='localhost', port=3306,user='root',passwd='mysql', db='DB_P001')
dfVars = pd.read_sql('select * from markeff_5_varlist', con=mysql_cn, chunksize = 10)

一旦我运行 dfVars 数据框就会被填充,但是 mysql 中有一个读锁。这种锁定一直持续到 mysql 重新启动。

--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
1 read views open inside InnoDB
Main thread process no. 2567, id 140597860407040, state: sleeping
Number of rows inserted 0, updated 0, deleted 0, read 11494
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 3.31 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================

非常感谢您的帮助。

谢谢,

【问题讨论】:

  • 能否先尝试使用sqlalchemy进行连接,看看是否还有同样的问题?请参阅pandas.pydata.org/pandas-docs/stable/io.html#sql-queries 了解如何将 sqlalchemy 引擎用于read_sql
  • 您正在使用chunksize = 10 - 它太小了,除此之外:If specified, return an iterator where chunksize is the number of rows to include in each chunk。所以你以一种非常奇怪的方式使用它

标签: python mysql python-2.7 pandas dataframe


【解决方案1】:

这是使用chunksize 的问题。 @MaxU 在他的评论中指出的 chunksize 参数创建了一个迭代器。这意味着您正在提交查询并准备好从数据库中以块的形式接收结果。在您消耗整个迭代器之前,数据库将被锁定。

如果数据库没有被锁定,那么它将无法保证查询的结果是准确的,同时允许对数据库进行写入/编辑。

要耗尽迭代器,请使用 next(dfVars) 直到它被耗尽或循环遍历迭代器,例如:

for df_chunk in pd.read_sql(... chunksize=...):
    <do something>

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2020-06-18
    相关资源
    最近更新 更多