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

Pythonpymysql

时间:2023-03-25 21:39:08 Python

安装mysql数据库难度堪比oracle数据库。安装步骤如下:InstallMariaDByuminstallmariadbmariadb-server#安装,centos7默认的mysql是mariadbsystemctlstartmariadb#启动mariadbsystemctlenablemariadb#开机自启动mysql_secure_installation#设置root密码mysql-uroot-p#登录并登录installpymysqlpipinstallpymysql基本操作数据库的基本操作是:创建连接,获取游标,执行sql提交事务:importpymysql#connectfunction打开数据库连接conn=pymysql.connect(host='192.168.110.13',user='root',password='123456',database='student')#游标方法创建游标对象cur=conn.cursor()#execute方法执行SQL语句cur。execute("SELECTVERSION()")#fetchone方法获取单条数据data=cur.fetchone()print('Databaseversion:{}'.format(data))#关闭游标cur.close()#关闭数据库连接conn.close()DDLDDL:数据定义语言。包括创建表,创建索引等importpymysql#connect函数打开数据库连接conn=pymysql.connect(host='192.168.110.13',user='root',password='123456',database='student')#cursor创建游标对象的方法curcur=conn.cursor()#createtablesql='''createtableuser(namechar(20)notnull,ageint,sexchar(1))'''cur.execute(sql)#关闭游标cur.close()#关闭数据库连接conn.close()DMLDML:数据操作语言,包括增、删、改三种操作。insertimportpymysql#connect函数打开数据库连接conn=pymysql.connect(host='192.168.110.13',user='root',password='123456',database='student')#cursor方法创建游标对象当前=conn。cursor()#createtablesql='''insertintouser(name,age,sex)values('suncle',18,'m')'''try:#执行sql语句cur.execute(sql)#提交对数据库执行conn.commit()except:#如果出错,回滚conn.rollback()#关闭游标cur.close()#关闭数据库连接conn.close()updateimportpymysql#connect函数打开数据库连接conn=pymysql.connect(host='192.168.110.13',user='root',password='123456',database='student')#游标方法创建一个游标对象curcur=conn.cursor()#createtablesql='''updateusertsett.age=20wheret.name='suncle''''try:#执行sql语句cur.execute(sql)#提交到数据库执行conn.commit()except:#出错则返回Rollconn.rollback()#关闭游标cur.close()#关闭数据库连接conn.close()deleteimportpymysql#connect函数打开数据库连接conn=pymysql.connect(host='192.168.110.13',用户='root',密码='123456',database='student')#创建游标对象的游标方法curcur=conn.cursor()#createtablesql='''deletefromuserwhereage=20'''try:#执行sql语句cur.execute(sql)#提交到数据库执行conn.commit()except:#如果出错,回滚conn.rollback()#关闭游标cur.close()#关闭数据库连接conn.close()QUERY基本查询主要有三个函数cursor.fetchall返回行元组cursor.fetchmany返回行元组,可以指定返回前N行等价于fetchall分片,fetchall[:N]cursor.fetchone返回第一行,等价于fetchall[0]的查询语句如下:cur.execute('''select*fromusertwheret.age<=19;''')三种方法得到的结果分别是:cur.fetchall()#(('suncle',18,'m'),('suncle1',19,'m'))cur.fetchmany(1)#(('suncle',18,'m'),)cur.fetchone()#('suncle',18,'m')可见:每一行数据也是一个元组,如果要返回带列名的数据,元组的内容由sql决定,即返回一个d字典,那么你需要使用cursors.DictCursorDictCursor创建游标时创建一个DictCursor类型,可以以字典的形式取回结果。codeimportpymysqlconn=pymysql.connect(host='192.168.110.13',user='root',password='123456',database='student')#创建游标时指定游标参数cursor=pymysql.cursors。DictCursor表示游标类型cur=conn.cursor(cursor=pymysql.cursors.DictCursor)cur.execute('''select*fromusertwheret.age<=20;''')cur.fetchall()fetchall返回:[{'age':18,'name':'suncle','sex':'m'},{'age':19,'name':'suncle1','sex':'m'},{'age':20,'name':'suncle2','sex':'m'}]返回每一行记录是一个字典,整体结果是一个字典列表。默认游标是元组的元组。基于参数化查询的SQL注入importpymysqlconn=pymysql.connect(host='192.168.110.13',user='root',password='123456',database='student')cur=conn.cursor()defget_user(age=18):sql='''select*fromusertwheret.age<={};'''.format(age)cur.execute(sql)returncur.fetchall()get_user()#return(('suncle',18,'m'),)get_user('18or1=1')#返回(('suncle',18,'m'),('suncle1',19,'m'))当sql条件包含在传入参数age中,会出现sql注入,导致结果可能不符合要求。解决sql注入,我们可以使用参数化查询。使用参数化查询做如下修改避免sql注入importpymysqlconn=pymysql.connect(host='192.168.110.13',user='root',password='123456',database='student')cur=conn.cursor()defget_user(age=18):#不管数据库定义的类型,统一使用%ssql='''select*fromusertwheret.age<=%s;'''.format(age)cur.execute(sql,(age,))#参数化查询returncur.fetchall()参数化查询最大的好处就是避免了SQL注入,同时避免了参数化后SQL的多次硬解析,可以提高查询效率。因此,应始终使用参数化查询。上下文管理数据库连接和游标都支持上下文管理。游标视图cur实例对应Cursor类的方法cur=conn.cursor()help(cur)对应的with语句用cur如下:cur.execute('''select*fromuser''')cur.execute('''select*fromuser''')#抛出错误:ProgrammingError:CursorclosedwithThecurhasbeenclosedafterthestatementblockends.Connection通过帮助命令查看Connection类的__enter__和__exit__方法的实现conn=pymysql.connect(host='192.168.110.13',user='root',password='123456',database='student')help(conn)#conn是一个Connection类,结果如下:|__enter__(自我)|返回游标的上下文管理器||__exit__(self,exc,value,traceback)|成功退出后,提交。异常时,rollback__enter_method会返回一个游标__exit__method:如果启动成功,commit会自动提交,如果发生异常,rollback会回滚。对应的with语句使用如下,connascur:cur.execute('''updateusertsett.age=20wheret.name='suncle'''')cur.execute('''select*fromuser''')#退出with块后,游标还没有关闭虽然游标没有关闭,但是数据库操作已经完成submit.游标和连接公共上下文管理withconnascur:withcur:cur.execute('''updateusertsett.age=20wheret.name='suncle'''')退出整个上下文管理块后,游标将关闭并自动提交。数据库连接池一般来说,应用程序访问数据库的过程是:加载数据库驱动,建立数据库连接访问数据库,执行SQL语句断开数据库连接。与性能正常的SQL执行效率相比,建立连接是一个耗时的过程。活动,系统也为每个连接分配内存资源。在大量并发web请求的情况下,必然会导致频繁的数据库操作。而频繁的数据库连接操作必然会占用大量的系统资源,降低系统的响应速度,严重的甚至会导致服务器崩溃。引入数据库连接池技术后,应用程序访问数据库的过程是:当请求进行数据库操作时,将创建的数据库连接从连接池中取出来执行sql语句,而不断开数据库连接,而是将把它放回到连接池中供下次使用连接池的另一个优点是它可以控制数据库的压力。当大量用户同时涌入时,连接池只会使用池来限制数据库的连接数,而不会不断地向数据库请求连接,最终会导致服务器崩溃。Python实现数据库连接池,使用队列Queue来保存数据库连接。代码如下fromqueueimportQueueimportpymysqlclassConnectionPool():#args和kwargs用于接收数据库url信息def__init__(self,size,*args,**kwargs):self.args=argsself.kwargs=kwargsself.size=sizeself.pool=Queue(maxsize=self.size)for_inrange(self.size):self.pool.put(self._connect())def_connect(self):returnpymysql.connect(*self.args,**self.kwargs)@staticmethoddef_close(conn):conn.close()defget_connection(self):returnself.pool.get()defreturn_connection(self,conn):返回self.pool.put(conn)defclose_pool(self):whilenotself.is_empty():self._close(self.pool.get())defis_empty(self):returnself.pool.empty()defis_full(self):返回自我。水池。full()defcurrent_connection_count(self):返回自我。水池。qsize()池=ConnectionPool(20,host='192.168.110.13',user='root',password='123456',database='student')conn=pool.get_connection()#获取数据库连接print(conn)#print(pool.current_connection_count())#19cur=conn.cursor()cur.execute("SELECTVERSION()")data=cur.fetchone()print('数据库版本:{}'.format(data[0]))cur.close()pool.return_connection(conn)#关闭游标后需要回收数据库连接print(pool.current_connection_count())#20记得给我点赞哦!对计算机各个方向的视频课程和电子书,从入门、进阶、实用进行了认真梳理,并按照目录进行合理分类。你总能找到你需要的学习资料。你在等什么?立即关注并下载!!!念念不忘,必有回响,朋友们,点个赞吧,非常感谢职场亮哥,YY资深软件工程师,四年工作经验,不服的斜杠程序员成为领导者。听我说,我进步很大。如果有幸帮到你,请给我一个【点赞】,给我一个关注,如能评论鼓励,将不胜感激。职场凉阁文章列表:更多文章我的所有文章和回答均与版权保护平台合作,版权归职场凉阁所有。未经授权转载必究!