文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

pandas中read_sql使用参数进行数据查询的实现

2024-04-02 19:55

关注

pandas.read_sql 可以在数据库中执行指定的SQL语句查询或对指定的整张表进行查询,以DataFrame 的类型返回查询结果,这是在跟数据库进行交互操作时很重要的一步——既读取数据,还返回DataFrame方便处理。

要解决的问题: 编写过的SQL语句需要重复使用,这就涉及到参数,使用参数来替换条件,然后根据需要替换参数。

一、之前的处理方法

在没有使用参数之前,我一直使用的是正则法,也就是利用 re.sub 这个方法将需要的SQL内容替换掉,这样的好处就是可以替换任意内容,缺点就是必须每次使用的时候 import re.sub。

    from re import sub
    import sqlalchemy
    import pandas as pd
    # 创建数据库连接,这里使用的是pymysql
    engine = sqlalchemy.create_engine("mysql+pymysql://username:password@ip:port/store_name")
    sql = "select * from test where id = 'pid'"
    # 使用 sub 进行数据替换
    data = pd.read_sql(sub("pid", '1', sql), engine)

在这里使用的时候 pid 是为了统一处理才用的标识名,这样在以后不管什么时候都只需要对 pid 进行替换即可。

有一点需要注意的是 sub 替换后的传入是字符串,但是传入到 替换到SQL中是不会变的。比如

sql = "select * from test where id = pid" data =
pd.read_sql(sub("pid", '1', sql), engine) 

进行 sub("pid", '1',> sql) 操作后 SQL 变成了

sql select * from test where id = 1

如果 id 字段是 int 类型那就没问题,但是如果 id 字段是 char 或 varchar 等其他类型就会出现字段类型是字符串但给的是数字(mysql 很宽容,不一定会报错,但是从数据类型上来说肯定是错了)

二、使用 read_sql 中的 params 传入参数

1.文档说明

 pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)[source]

read_sql 方法中已经有了 params 这个参数,这个就是可以进行参数的传递,具体的描述如下

params : list, tuple or dict, optional, default: None
List of parameters to pass to execute method. The syntax used to pass parameters is database driver dependent. Check your database driver documentation for which of the five syntax styles, described in PEP 249’s paramstyle, is supported. Eg. for psycopg2, uses %(name)s so use params={‘name’ : ‘value’}

意思就是可以使用功能 list, tuple or dict 传递参数,但是如何怎么设置参数和传递参数需要依据使用的数据库引擎。PEP 249’s paramstyle 如下表

paramstyleMeaning
qmarkQuestion mark style, e.g. …WHERE name=?
numericNumeric, positional style, e.g. …WHERE name=:1
namedNamed style, e.g. …WHERE name=:name
formatANSI C printf format codes, e.g. …WHERE name=%s
pyformatPython extended format codes, e.g. …WHERE name=%(name)s

总结下就是在SQL语句中使用?, :1, :name, %s, %设置参数,然后在params 使用 list, tuple or dict 进行参数的传递

2.具体的使用

    from re import sub
    import sqlalchemy
    import pandas as pd
    # 创建数据库连接
    engine = sqlalchemy.create_engine("mysql+pymysql://username:password@ip:port/store_name")
    sql = "select * from test where id = %(pid)s"
    # 使用 params 进行参数传递
    data = pd.read_sql(sql, engine, params={'pid': '1'})

具体的参数就如上面代码所示,使用了 %(pid)s 设置参数,再用params={‘pid’: ‘1’}传递参数,在Stack Overflow上有个提问也是关于这个的,里面还有关于psycopg2 和SQLite 的参数传递。

三、总结对比

之前没有想过使用参数,是因为在SQL中我不仅要替换固定条件,而且有时候需要替换大段的SQL,所以使用 sub 会更灵活也更模糊(传入的是字符串,到了SQL里面数字还是字符串得再处理一遍),但是使用方法自带的参数传递可以很明确的传递正确的数据和数据类型,而且不觉得使用方法自带的参数传递很优雅?

四、字符串的格式化

对于参数的传递还有另外一种就是python中的字符串格式化,format函数可以实现不带参数、带索引参数、带关键字参数,python的字符串格式化可以参考python格式化输出
下面是format的使用示例

in : print("{one} are {two} {three}".format(one='you', two=1, three='pig'))
out: you are 1 pig

这里的1应该为a,但是为了演示传递整数参数

到此这篇关于pandas中read_sql使用参数进行数据查询的实现的文章就介绍到这了,更多相关pandas read_sql查询内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯