当前位置: 首页 > 后端技术 > Python

教你搭建python连接数据库,快速访问工具

时间:2023-03-25 23:47:28 Python

在数据生产和应用部门,数据访问分析是一个很常见的需求。事实上,业务人员的需求一直在变化。最高效的方式是让业务部门自己来做为了减少不必要的重复劳动,一般情况下,业务部门的数据库表结构一般是固定的。根据实际业务,将数据检索需求做成sql脚本,快速完成数据获取---授人以鱼之道,提供平台或工具如何实现自助检索查询工具?基于底层数据开发并不难。无非就是将用户输入的变量作为过滤条件,将参数映射到sql语句,生成一条sql语句,然后在数据库中执行。最后用QT开发一个GUI界面,在用户界面上点击过滤Conditions,signal触发对应的按钮和绑定参数传递槽函数执行具体思路:1.这里的数据库连接类使用pandas读写来操作oracle数据库2.主要功能模块1)输入参数模块,外部输入条件参数,建立数据库Key字段映射--注:读取外部txt文件,过滤字段可能需要转换成键值对2)SQL语句收集模块,这里统一存放要执行的业务sql语句3)数据处理函数工厂4)使用多线程提取数据1.数据库连接类cx_Oracle是一个Python扩展模块,相当于Python的Oracle数据库。它使用所有数据库访问模块的通用数据库API来实现对Oracle数据库的查询和更新。Pandas是基于NumPy开发的。为了解决数据分析任务的模块,Pandas引入了大量的库和一些标准的数据模型,并提供了高效操作大型数据集所需的方法类和函数。Pandas主要通过三种方式调用数据库:read_sql_table、read_sql_query、read_sql。介绍Pandas中read_sql_query方法的使用1:pd.read_sql_query()读取自定义数据,返回DataFrame格式,通过SQL查询脚本进行增删改查。pd.read_sql_query(sql,con,index_col=None,coerce_float=True,params=None,parse_dates=None,chunksize=None)sql:要执行的sql脚本,文本类型con:数据库连接index_col:选择返回的结果集索引Column,text/textlistcoerce_float:非常有用,直接将数字字符串作为float读入parse_dates:将一列日期字符串转换为datetime数据,类似于pd.to_datetime函数。params:传递给sql脚本的参数,官方的类型是列表、元组和字典。传递参数的语法取决于数据库驱动程序。chunksize:如果提供一个整数值,将返回一个生成器,每次输出的行数为提供值的大小。read_sql_query()中可以接受SQL语句,而DELETE、INSERTINTO、UPDATE操作没有返回值(但会在数据库中执行),程序将抛出SourceCodeCloseError并终止程序。选择返回结果。如果想继续运行,可以尝试捕获这个异常。2:pd.read_sql_table()读取数据库中的表并返回DataFrame格式(按表名)columns=None,chunksize=None)3:pd.read_sql()通过SQL脚本或表名读取数据库importpandasaspdpd.read_sql(sql,con,index_col=None,coerce_float=True,params=None,parse_dates=None,columns=None,chunksize=None)下面创建的连接oracel数据库的连接类Oracle_DB主要提供了两个操作数据的函数和方法。importcx_Oracle#Pandas读写操作Oracle数据库importpandasaspd#避免编码问题导致的乱码importosos.environ['NLS_LANG']='SIMPLIFIEDCHINESE_CHINA.UTF8'classOracle_DB(object):def__init__(self):try:#连接到oracle#方法一:sqlalchemy提供的create_engine()#fromsqlalchemyimportcreate_engine#engine=create_engine('oracle+cx_oracle://username:password@ip:1521/ORCL')##方法二:cx_Oracle.connect()self.engine=cx_Oracle.connect('username','password','ip:1521/database')除了cx_Oracle.Errorase:print("Error%d:%s"%(e.args[0],e.args[1]))exit()#查询部分信息defsearch_one(self,sql,spam):try:##用sql语句查询并获取数据#生成参数:spam--query指定字段参数df=pd.read_sql_query(sql,self.engine,params=sparm)self.engine.close()exceptExceptionase:return"Error"+e.args[0]returndf#查询所有信息defsearch_all(self,sql):try:##用sql语句查询获取数据df=pd.read_sql_query(sql,self.engine)self.engine.close()exceptExceptionase:return"error"+e.args[0]returndf2.数据提取主功能模块cx_Oracle是一个Python扩展模块,相当于python中Oracle数据库的驱动。它利用所有数据库访问模块的通用数据库API实现对Oracle数据库的查询。并更新1)外部入参模块的txt文本中包含一列数据,第一行列名,读取时忽略第一行#BuildID——数字字典defbuildid():sqlid="""select*fromb_build_info"""db=Oracle_DB()#实例化一个对象b_build_info=db.search_all(sqlid)ID_bUILDCODE=b_build_info.set_index("BUILDCODE")["ID"].to_dict()returnID_bUILDCODE#传入的list要通过文本导出的数据defread_task_list():build_code=buildid()tasklist=[]is_first_line=Truewithopen("./b_lst.txt")aslst:forlineinlst:ifis_first_line:is_first_line=Falsecontinuetasklist.append(build_code.get(line.strip('\n')))#键值对转换返回tasklist2)业务sql语句集合注意in后面的{0}不要加引号,这里是作为a传入的tuple,spam={'Start_time':'2021-04-01','End_time':'2021-05-01'}中传入params参数,这里的参数可以根据需要更改defsql_d(lst):#蒙特hly数据sql_d_energy_item_month="""select*fromd_energy_item_monthwhererecordingdate>=to_date(:Start_time,'yyyy-MM-dd')andrecorddate=to_date(:Start_time,'yyyy-MM-dd')andd.recorddate