Pandas中用with结构与MySQL数据库交互

Python中,with可以让代码更简练,若产生异常,清理工作更简单

Pandas中使用to_sql和read_sql数据库进行数据交换,一般的代码中,我们都要先建立连接connect,然后使用to_sql或者read_sql。为了防止异常中断整个程序,往往使用try语句保证程序正常运行。

如果追求更加Pythonic的代码,可以用with结构来使代码更加精简
我最初模仿with open as 的结构,尝试的代码是这样的

对于read_sql来说

import MySQLdb

sql = '*************'
with MySQLdb.connect(ip, user, password, dbname, charset='utf8') as conn:
	res = pd.read_sql(sql, conn)

是我把关闭文件的close()跟关闭数据库连接的close()混淆了
百度了半天之后,在一位大神的博客里找到了方法(写这篇博文的时候,回去找那个博客却找不到了)

import MySQLdb
from contextlib import closing

sql = '*************'
with closing(MySQLdb.connect(ip, user, password, dbname, charset='utf8')) as conn:
	res = pd.read_sql(sql, conn)

我看了一些技术文章,都是用sqlalchemy,pymysql/mysql.connector来读取MySQL中的数据,例如在http://www.itkeyword.com/doc/2039969901128520x595/writing-to-mysql-database-with-pandas-using-sqlalchemy-to-sql 看到的

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

engine = create_engine('mysql+mysqlconnector://[user]:[pass]@[host]:[port]/[schema]', echo=False)
cnx = engine.raw_connection()
data = pd.read_sql('SELECT * FROM sample_table', cnx)

感觉这么写更加正规一些,因为read_sql的反向操作to_sql只支持两类MySQL引擎,一个是sqlalchemy,另一个是sqlliet3

具体可以参考:
http://blog.csdn.net/qq_34685317/article/details/72896306

关于contextlib的介绍,和关于with结构的解析,参考:
https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/

to_sql这么写还是会报错
DatabaseError: Execution failed on sql ‘SELECT name FROM sqlite_master WHERE type=‘table’ AND name=?;’: not all arguments converted during string formatting

原因我找了一下,是因为pandas的to_sql支持的引擎并不多,参见其con参数:

con : SQLAlchemy engine or DBAPI2 connection (legacy mode)
    Using SQLAlchemy makes it possible to use any DB supported by that library. If a DBAPI2 object, only sqlite3 is supported.

简单的说,to_sql就只支持SQLAlchemy和SQLite3。SQLite3用法非常简单,我这边就不详细介绍了,而SQLAlchemy大家可以参考我的github,好用记得给个赞呀!
我的SQLAlchemy代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以使用`pandas`的`to_sql()`方法将数据存入MySQL数据库中。以下是步骤: 1. 首先,您需要安装`pandas`和`pymysql`库,您可以使用以下命令安装: ``` pip install pandas pymysql ``` 2. 导入必要的库: ```python import pandas as pd import pymysql from sqlalchemy import create_engine ``` 3. 建立到MySQL数据库的连接: ```python # 创建连接 db_connection = create_engine('mysql+pymysql://username:password@host:port/database_name') ``` 其中,`username`和`password`分别是您的MySQL数据库的用户名和密码,`host`是MySQL数据库所在的主机名或IP地址,`port`是MySQL数据库的端口号,`database_name`是您要将数据存储的MySQL数据库的名称。 4. 加载数据到`pandas`数据帧: ```python df = pd.read_csv('data.csv') # 将数据加载到数据帧中 ``` 其中,`data.csv`是您要存储到MySQL数据库中的数据文件的名称。 5. 将数据帧中的数据存储到MySQL数据库中: ```python df.to_sql(name='table_name', con=db_connection, if_exists='replace', index=False) ``` 其中,`name`是您要将数据存储到的MySQL数据库表的名称,`con`是与MySQL数据库的连接,`if_exists`是指如果表已存在,将如何处理它。'replace'表示如果表已存在,则删除该表并重新创建它,`index`参数是指是否将数据帧的索引存储为MySQL数据库表中的一列。 以上是将`pandas`中的数据存储到MySQL数据库的基本步骤。 ### 回答2: 将pandas中的数据存入MySQL数据库的方法如下: 首先,需要确保已经安装了pandas和pymysql这两个库。 1. 首先,导入需要的库: ```python import pandas as pd from sqlalchemy import create_engine ``` 2. 读取数据到pandas的DataFrame对象中: ```python df = pd.read_csv('data.csv') # 以CSV格式为例,也可以是其他格式的数据文件 ``` 3. 连接数据库: ```python engine = create_engine('mysql+pymysql://username:password@host:port/database', echo=True) ``` 其中,username是数据库用户名,password是密码,host是主机名,port是端口号,database是数据库名。echo=True表示打印执行的SQL语句。 4. 将DataFrame中的数据导入到数据库表中: ```python df.to_sql(name='table_name', con=engine, if_exists='replace', index=False) ``` 其中,name是表名,if_exists='replace'表示如果表已存在则替换掉,index=False表示不保存索引。 完整的代码如下: ```python import pandas as pd from sqlalchemy import create_engine # 读取数据到DataFrame对象 df = pd.read_csv('data.csv') # 连接数据库 engine = create_engine('mysql+pymysql://username:password@host:port/database', echo=True) # 将数据导入到数据库表中 df.to_sql(name='table_name', con=engine, if_exists='replace', index=False) ``` 以上就是将pandas中的数据存入MySQL数据库的方法。 ### 回答3: 要将pandas中的数据存入MySQL数据库,可以按照以下步骤进行操作: 1. 导入所需的库: ``` import pandas as pd from sqlalchemy import create_engine ``` 2. 创建数据库连接: ``` engine = create_engine('mysql+pymysql://username:password@host:port/database_name') ``` 其中,username是数据库的用户名,password是密码,host是数据库服务器的地址,port是服务器端口号,database_name是要连接的数据库名称。 3. 将pandas DataFrame数据写入MySQL数据库: ``` df.to_sql('table_name', con=engine, if_exists='replace', index=False) ``` 其中,df是要存入数据库pandas DataFrame,table_name是要存入的表名,con是数据库连接对象,if_exists='replace'表示如果表已经存在则替换表。 如果想要追加数据到已经存在的表中,可以将if_exists的值设为'append'。 4. 关闭数据库连接: ``` engine.dispose() ``` 最后需要关闭数据库连接,释放资源。 这样就可以将pandas中的数据存入MySQL数据库了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值