pandas直接操作数据库

使用pandas直接对数据库进行增删改查是很方便的,这里简单的总结pandas.read_sql()和pandas.DataFrame.to_sql()使用,以及遇到的问题。

pandas.DataFrame.to_sql()

官方原文:Databases supported by SQLAlchemy [1] are supported. Tables can be newly created, appended to, or overwritten.

也就是说,写入数据库仅支持SQLAlchemy建立的接口。其中,URL连接字符串规则如下:

  • MS Sqlserver

mssql+pymssql://<用户名>:<密码>@<数据库名称>/?字符集=utf8

  • MySQL

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

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中特殊字符转义编码:

字符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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐