【问题标题】:How to write a pandas dataframe as a table into a MySQL database?如何将 pandas 数据框作为表写入 MySQL 数据库?
【发布时间】:2016-10-06 20:51:14
【问题描述】:

只是一个简单的问题,伙计们:我在 mysql 中创建了一个 darabase(意见):

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| opinions           |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.06 sec)

我还有一个熊猫数据框df

import pandas as pd
df = pd.read_csv('file.csv', sep='|', names=['id', 'opinions'])
df.head(3)

输出:

    id content
0   id1 'blablababla
1   id2 'blalbabla
...
n   idn 'blalbabl

然后,我想将 df 作为表 (items) 加载到 opinions 数据库中。这是我尝试过的:

import mysql.connector
from sqlalchemy import create_engine

engine = create_engine('mysql+mysqlconnector://user:password@localhost:3306/opinions', echo=False)
df.to_sql(name='items', con=engine, if_exists = 'replace', index=False)
df

但是,我得到了这个例外:

OperationalError: (mysql.connector.errors.OperationalError) 2055: Lost connection to MySQL server at 'localhost:3306', system error: 32 Broken pipe

我应该如何将表df 加载或写入opinions 数据库?

【问题讨论】:

  • 您的问题在于读取数据库,而不是写入数据库
  • 感谢@PaulH 的帮助,您能否提供一个如何正确操作的示例?
  • 也许对PyMySQLcnx = pymysql.connect(user='user', password='pw', host= '127.0.0.1', port=3306, db='mydb', autocommit=True) df=psql.read_sql_query('call sproc', con=cnx)有帮助
  • 嗯,也许可以帮助this
  • 你是否真的在数据库中建过表,如果没有,那么问题不在于你对数据库的了解程度,我会去了解基本的数据库使用,然后解决上述问题。如果您确实在 MySQL 中创建了表,请显示上面的“创建表”sql。

标签: mysql python-3.x pandas pymysql


【解决方案1】:

在您的 MySQL 服务器上,opinions 不是table,而是database(正如show databases 所暗示的那样),它基本上是表的集合。但是,您只能在表上发出 select 语句。

您可以检查哪些表,例如通过SHOW TABLES IN opinions 存在。 将数据库作为参数添加到连接中也很方便:

config = {
    'user' : 'root',
    'passwd' : 'password',
    'host' : 'localhost',
    'raise_on_warnings' : True,
    'use_pure' : False,
    'database' : 'opinions'
    }
con = mysql.connector.connect(**config)

这会导致所有表引用都以opinions 数据库中的表为目标。 现有表上的普通选择应该可以工作:

data = pd.read_sql('SELECT * FROM <some_table_name>', con)

【讨论】:

  • 这确实有效。但是,我仍然无法将数据框作为表加载到数据库中,也无法将数据框插入到表中:Empty DataFrame Columns: [id, opinions] Index: []
  • 我对@9​​87654330@ 不是很熟悉——但您真的通过read_sql 调用检索到任何结果吗?另外:如果我的回答对你有帮助,请采纳:)
  • 感谢塞巴斯蒂安的帮助,我会接受你的回答。还有一件事,我尝试了以下方法:df.to_sql(name = 'opinions2', con = con, flavor='mysql', schema=None, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None)。但是,当我用 sql 描述它时,表是空的......我应该如何将数据帧作为新表加载到数据库中或将其覆盖到现有表中?
  • 好吧,如果表格是空的,您必须先填写一些数据。你可以例如使用一些任意数据(与您的表定义匹配)创建一个数据框并将其插入到您的数据库中。也许您还应该考虑一下您实际上要完成的工作(从 sql 中读取数据并尝试将其重新插入毕竟没有太大意义...)
【解决方案2】:

使用 Pandas 从 MySQL 读取数据。 MySQLdb 写入数据库。

  mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | opinions           |
    | performance_schema |
    | sys                |
    +--------------------+

太棒了!对于您的示例,将test 替换为opinions

mysql> use test;
Reading table information for completion of table and column names

Database changed
mysql> show tables;
+-----------------+
| Tables_in_test |
+-----------------+
| _t              |
| food            |
| food_in         |
| food_min        |
| type            |
| user            |
+-----------------+
4 rows in set (0.00 sec)

mysql> select * from test.food;
+----+-------+--------------+--------+----------+
| ID | Cat   | Item         | price  | quantity |
+----+-------+--------------+--------+----------+
|  1 | Food  | Pizza        | 2.7500 |      300 |
|  2 | Liq   | Beer         | 2.5000 |      300 |
|  4 | Food  | Sandwich     | 4.0000 |      222 |
| 12 | Food  | Soup         | 3.5000 |      100 |
+----+-------+--------------+--------+----------+
4 rows in set (0.00 sec)

所以:

data = pd.read_sql('SELECT * FROM opinions', con)

变成:

data = pd.read_sql('SELECT * FROM opinions.MYTABLETHATIWANT', con)

我使用 MySQLdb 写入数据库。所以,我可以使用基本的 python 和 pandas。 您可能还会遇到禁止数据库/表访问的权限问题。您使用的是 root 用户,还是其他用户并已为用户设置了权限。

【讨论】:

  • 谢谢你的帮助,你能提供一个如何写的例子吗?
  • @ml_student 写什么?
  • 一个熊猫数据框df,假设我都准备好了...实际上我已经有了一个带有数据的数据框...我只是因为空间问题而省略了它...
  • 你还没有告诉我你想帮助你写什么?更新上面的问题
  • 我看到您在 MySQL 上使用“root”。停止它!--创建一个用户并使用该用户。您是否阅读过有关 pandas 写入数据库的文档。我不使用 pandas 写入 MySQL。抱歉,没有太多帮助 --
猜你喜欢
  • 2017-02-17
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 2020-02-21
  • 2018-04-20
  • 1970-01-01
相关资源
最近更新 更多