使用pandas直接对数据库进行增删改查是很方便的,这里简单的总结pandas.read_sql()和pandas.DataFrame.to_sql()使用,以及遇到的问题。
官方原文:Databases supported by SQLAlchemy [1] are supported. Tables can be newly created, appended to, or overwritten.
也就是说,写入数据库仅支持SQLAlchemy建立的接口。其中,URL连接字符串规则如下:
mssql+pymssql://<用户名>:<密码>@<数据库名称>/?字符集=utf8
mysql+pymysql://<用户名>:<密码>@<数据库名称>/?字符集=utf8
SQLAlchemy是一个Python的ORM(Object Relational Mapper)库,它提供了一种简单、灵活的方式来连接和操作数据库。SQLAlchemy支持多种数据库,包括MySQL、PostgreSQL、SQLite、SQL Server等。
示例代码如下:
import pymssql
# 或者,mysql
#import pymysql
import pandas as pd
from sqlalchemy import create_engine
def mssql_engine_db():
# 连接数据库参数
password = '*****' # 密码中含有特殊字符@,需要转译为 %40
user = '****'
host_ip = '*******' # 主机名或IP地址
db_name = '********' # 数据库名称
engine = create_engine(
'mssql+pymssql://'+ user + ':' + password + '@' + host_ip + '/' + db_name + '?charset=utf8',
echo=True
)
return engine
写入数据库的操作就很简单了,示例如下:
engine = mysql_engine_db()
tablename = 'table_name' # 表名称
# dd为DataFrame,过程略
dd.to_sql(tablename, engine,index=False, if_exists='append')
其中,if_exists表示,如果表已经存在,则采用扩展方式继续插入。
if_exists参数配置含义:
fail: Raise a ValueError.
replace: Drop the table before inserting new values.
append: Insert new values to the existing table.
如果你的密码或着其他的名称中出现了“@"等字符怎么办?肯定解析出错了!需要”特殊字符转义编码“,详见下文的转译规则。
pandas.read_sql()支持数据库接口API方式和SQLAlchemy两种方式。
API接口定义示例如下:
def mssql_db():
# 连接数据库参数
password = '*****' # 密码中含有特殊字符@,需要转译为 %40
user = '****'
host_ip = '*******' # 主机名或IP地址
db_name = '********' # 数据库名称
conn =pymssql.connect(
host=host_ip , #这里的host可以用本机ip或ip+端口号
port="1433", #TCP端口
user=user,
password=password ,
database=db_name ,
charset="GBK"
#这里设置全局的GBK,如果设置的是UTF—8需要将数据库默认的GBK转化成UTF-8
)
return conn
这种,也适合其他数据库,例如mysql,把其中的”pymssql.connect“替换为”pymysql.connect“即可,具体配置请参照上篇博文”Pandas的to_sql()插入数据到mysql中所遇到的问题“。
使用上述API接口查询示例代码如下:
conn = mssql_db()
df0=pd.read_sql('select * from tale_name',conn)
使用sqlalchemy 接口的查询示例代码如下:
engine = mysql_engine_db()
df1=pd.read_sql('select * from tale_name',engine)
比较简单吧,不妨试试。
URL中特殊字符转义编码是指在URL中使用一些特殊字符时,需要将其转换为十六进制编码的形式,以便在传输过程中不会出现乱码。例如,空格需要转换为加号(+),正斜杠(/)分隔目录和子目录,问号(?)分隔URL和查询,百分号(%)制定特殊字符等等。
网址URL中特殊字符转义编码:
字符 | URL编码值 |
---|---|
空格 | %20 |
" | %22 |
# | %23 |
% | %25 |
& | %26 |
( | %28 |
) | %29 |
+ | %2B |
, | %2C |
/ | %2F |
: | %3A |
; | %3B |
< | %3C |
= | %3D |
> | %3E |
? | %3F |
@ | %40 |
\ | %5C |
| | %7C |
参考:
p312011150. 网址URL中特殊字符转义编码. CSDN博客 .2017.12
肖永威. Pandas的to_sql()插入数据到mysql中所遇到的问题. CSDN博客. 2023.06