pandas中read_sql使用参数进行数据查询的实现
作者:飞羽喂马 发布时间:2023-08-01 23:14:08
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 如下表
paramstyle | Meaning |
---|---|
qmark | Question mark style, e.g. …WHERE name=? |
numeric | Numeric, positional style, e.g. …WHERE name=:1 |
named | Named style, e.g. …WHERE name=:name |
format | ANSI C printf format codes, e.g. …WHERE name=%s |
pyformat | Python 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,但是为了演示传递整数参数
来源:https://blog.csdn.net/qq_35318838/article/details/101056057
猜你喜欢
- python中安装包的方式有很多种:源码包:python setup.py install在线安装:pip install 包名(linux
- 1、创建Django项目打开pycharm,新建Django项目,可以选择一个虚拟环境建完之后目录如下:2、创建应用,我这里命名为demo在
- 1. OpenCV:模板匹配。 获得小跳棋中心位置2.
- Data URIData URI是由RFC 2397定义的一种把小文件直接嵌入文档的方案。通过如下语法就可以把小文件变成指定编码直接嵌入到页
- vscode安装python库1.已经在vscode中装了python并配置好python运行环境。检查是否正确配置好运行环境,按Windo
- 一、需求分析有一批key已经写入到3个txt文件中,每一个txt文件有30万行记录。现在需要读取这些txt文件,判断key是否在数据仓库中。
- 理论介绍分词是自然语言处理的一个基本工作,中文分词和英文不同,字词之间没有空格。中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文
- 我就废话不多说了,直接上代码吧!#Copyright (c)2017, 东北大学软件学院学生# All rightsreserved#文件名
- 在学习 Python 类的时候,会碰见类中有 __init__() 这样一个函数,其实它就是 Python 的构造方法。构造方法类似于类似
- 说检查点,其实就是对过去历史的记录,可以认为是log.不过这里进行了简化.举例来说,我现在又一段文本.文本里放有一堆堆的链接地址.我现在的任
- 如果当前绝对定位的元素需要透明(没啥内容、且不设置背景),背景元素有内容透出来的时候,IE6/IE7响应的不是期望的当前元素,而是背景元素。
- 本文实例为大家分享了python实现文件批量重命名的具体代码,供大家参考,具体内容如下代码:# -*- coding:utf-8 -*-im
- 本文实例讲述python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件的方法,该程序采用python 2.7编写。主
- 一、导入excel文件和相关库import pandas;import matplotlib;from pandas.tools.plott
- oracle远程连接数据库,需要配置本地服务,具体步骤如下:1.2.添加新的服务3.输入服务名(例如:orcl3即服务器数据库名)4.选择T
- 前言写这次博客其实事出有因,前几天呢,一个非常优秀的学姐在QQ空间里晒了自己的CSDN博客的总阅读量,达到了7万+,很厉害了,而且确实她的博
- 如果你搞过ASP的开发,你就会为ASP中没有好的完整的调试环境而头疼不己。我收集了网上相关所有信息提示,想给它做成单机的ASP开发错误提示软
- ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javascript写 的,主要用于创建前端用户界面,是一个与后台技术无关的
- 最近对动易CMS有个研究任务,具体研究什么,嘿嘿,保密。网络收集了九个常见的错误原因分析及解决方法错误提示: ADODB.Recordset
- asp三天学好ADO对象之第二天 今天来说一下Recordset对象的一些方法。1、AddNew 方法创建可更新 Recordset 对象的