使用python3的Pandas数据帧to_sql方法

时间:2017-05-19 06:32:26

标签: python mysql pandas

我有一个包含许多不同列的pandas数据框,并希望将特定列插入mySQL数据库。

我从文档中了解到,这样做的方法是使用to_sql,如下所示:

import pandas as pd
import mysql.connector
from sqlalchemy import create_engine

engine = create_engine(db)
data.to_sql(name='dbtable', con=engine, if_exists = 'append', index=False)

但是,当我在python3中运行它时,我得到以下ImportError:

Traceback (most recent call last):
  File "myfile.py", line 130, in <module>
    engine = create_engine('mysql+mysqlconnector://user:password@localhost:port/db')
  File "/home/pohzihow/.local/lib/python3.5/site-packages/sqlalchemy/engine/__init__.py", line 387, in create_engine
    return strategy.create(*args, **kwargs)
  File "/home/pohzihow/.local/lib/python3.5/site-packages/sqlalchemy/engine/strategies.py", line 80, in create
    dbapi = dialect_cls.dbapi(**dbapi_args)
  File "/home/pohzihow/.local/lib/python3.5/site-packages/sqlalchemy/dialects/mysql/mysqldb.py", line 110, in dbapi
    return __import__('MySQLdb')
ImportError: No module named 'MySQLdb'

在做了一些研究后,我发现实际上是mySQLdb does not support python3,但是关于pandas的文档说它需要SQLAlchemy引擎连接到数据库。

有没有办法直接使用python3将我的pandas数据框输出到mySQL数据库?

3 个答案:

答案 0 :(得分:3)

SQLAlchemy支持不同的mySQL DBAPI,如in the docs所述。在撰写本文时,这些是:

  • 的MySQL的Python
  • PyMySQL
  • MySQL Connector / Python
  • CyMySQL
  • OurSQL
  • Google Cloud SQL
  • PyODBC
  • zxjdbc for Jython

尝试使用列出的API之一而不是mySQLdb。

答案 1 :(得分:2)

使用pymysql作为DBAPI扩展ƘɌỈSƬƠƑ的答案

import pandas as pd
import pymysql
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://USER:PASSWORD@HOST/DATABASE")
con = engine.connect()

data.to_sql(name='dbtable', con=engine, if_exists = 'append', index=False)

答案 2 :(得分:0)

使用PyMySQL模块。这是最新版本,您需要在系统后台运行MySQL。代码就是这样,

import pymysql, pandas as pd
part1 = pd.read_csv("your_file_location)
part2 = part1["Column 1 Name", "Column2 Name"]
#and further code of yours#
for i in your_pandas_dataset:
    sql = "INSERT INTO your_table_name(your_column_attributes) \
            VALUES ('%d', '%s', #and so on#) %\
            (i[1], i[2],#and so on#)"
            self.cursor.execute(sql)
            self.db.commit()

您需要使用循环插入数据。并将数据导入SQL数据库。