首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将pandas数据帧作为表写入MySQL数据库?

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

Stack Overflow用户
提问于 2016-06-07 13:23:50
回答 2查看 4.5K关注 0票数 1

只有一个简单的问题:我在mysql中创建了一个数据库(观点):

代码语言:javascript
复制
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| opinions           |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.06 sec)

我还有一个熊猫数据帧df

代码语言:javascript
复制
import pandas as pd
df = pd.read_csv('file.csv', sep='|', names=['id', 'opinions'])
df.head(3)

输出:

代码语言:javascript
复制
    id content
0   id1 'blablababla
1   id2 'blalbabla
...
n   idn 'blalbabl

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

代码语言:javascript
复制
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

然而,我得到了这样的异常:

代码语言:javascript
复制
OperationalError: (mysql.connector.errors.OperationalError) 2055: Lost connection to MySQL server at 'localhost:3306', system error: 32 Broken pipe

如何将表df加载或写入到opinions数据库中?

EN

回答 2

Stack Overflow用户

发布于 2016-06-07 14:26:59

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

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

代码语言:javascript
复制
config = {
    'user' : 'root',
    'passwd' : 'password',
    'host' : 'localhost',
    'raise_on_warnings' : True,
    'use_pure' : False,
    'database' : 'opinions'
    }
con = mysql.connector.connect(**config)

这会导致所有表引用都指向opinions数据库中的表。然后,在现有表上执行普通select操作:

代码语言:javascript
复制
data = pd.read_sql('SELECT * FROM <some_table_name>', con)
票数 2
EN

Stack Overflow用户

发布于 2016-06-07 14:48:34

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

代码语言:javascript
复制
  mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | opinions           |
    | performance_schema |
    | sys                |
    +--------------------+

太棒了!对于您的示例,请使用opinions替换test

代码语言:javascript
复制
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)

所以:

代码语言:javascript
复制
data = pd.read_sql('SELECT * FROM opinions', con)

变成:

代码语言:javascript
复制
data = pd.read_sql('SELECT * FROM opinions.MYTABLETHATIWANT', con)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37671111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档