繁体   English   中英

如何将pandas数据帧作为表写入MySQL数据库?

[英]How to write a pandas dataframe as a table into a MySQL database?

只是一个快速提问的人:我在mysql(意见)中创建了一个darabase:

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

我还有一个pandas数据帧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数据库?

在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)

使用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用户还是其他用户并且已为用户设置了权限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM