设为首页 收藏本站
查看: 1372|回复: 1

[经验分享] python mysql模块

[复制链接]

尚未签到

发表于 2018-8-7 11:42:30 | 显示全部楼层 |阅读模式
  多次使用python操作mysql数据库,先与大家分享一下,关于如何使用python操作mysql数据库。mysql并不是python自带的模块,因此需要下载安装。(在windows平台下介绍该使用过程)
  1、下载/安装python-mysql
  下载地址:https://pypi.python.org/pypi/MySQL-python/1.2.5
  双击下载的文件,一直选择next就可以安装好(前提是必须已经安装了python),注意python-mysql与python对应的版本,否则在使用过程中会出现意想不到的错误。
  2、检查是否安装成功
  打开python交互界面,输入import MySQLdb,没有报错表示成功安装。
  如图:
DSC0000.jpg

  3、使用方式
  测试数据库为:
DSC0001.jpg

  3.1 与数据库建立连接
# 使用MySQLdb.connect()方法  
connection = MySQLdb.connect(host="127.0.0.1", port=3306, user="root", passwd="root", db="test")
  
# host : 主机名(IP)
  
# port : 端口号,mysql默认为3306
  
# user : 用户名
  
# passwd : 密码
  
# db : 数据库(默认连接的数据库)【可选】
  
# charset : 编码方式【可选】
  
# 如果未指定db属性,那么可以使用connection.select_db("数据库名称")选择指定数据库
  3.2 获取游标对象
# 具体的sql执行,都是通过游标对象完成的;通过连接对象的cursor方法获取游标对象  
# 初始状态游标执行第一个元素
  
cursor = connection.cursor()
  3.3 执行SQL语句
# 分为单个SQL执行和批量SQL执行,以及是否参数化(可以防止SQL注入)  
# query: sql字符串
  
# args :如果sql字符串为%s占位符那么args是元组或者列表,如果sql字符串占位符是%(key)s形式## ,那么是字典类型。否则为None(默认)
  
# 语法1:cursor.execute(query, args)
  
# 语法2:cursor.executemany(query, args)
  
# 范例1:使用语法1查询数据
  
import MySQLdb
  
if __name__ == "__main__":
  
    # create mysql connection
  
    connection = MySQLdb.connect(host="127.0.0.1", port=3306, user="root", passwd="root", db="test")
  
    # get cursor
  
    cursor = connection.cursor()
  
    # 返回执行结果数
  
    # nums = cursor.execute("select * from user where id=%s", [1]) # 使用%s占位符
  
    nums = cursor.execute("select * from user where id = %(id)s", {"id" : 1}) # 使用%(key)s占位符
  
    print(nums)
  
    print(cursor.fetchone())
  

  
# 范例2:使用语法2查询一条数据
  
import MySQLdb
  

  
if __name__ == "__main__":
  
    # create mysql connection
  
    connection = MySQLdb.connect(host="127.0.0.1", port=3306, user="root", passwd="root", db="test")
  
    # get cursor
  
    cursor = connection.cursor()
  
    # 返回执行结果数;
  
    nums = cursor.executemany("select * from user where id=%s", [[1], [2]])
  
    print(nums)
  
    print(cursor.fetchone())
  
    print(cursor.fetchmany())
  
    print(cursor.fetchall())
  
# 结果是:nums = 2, 但是查询结果却是id=2的结果;那是因为nums表示执行了多少个execute方法,# 而执行查询结果,却是覆盖了上一个结果,因此当使用语法2查询时,执行返回最后一个条件的结果
  对上述两种语法,这里做一些阐述:
  1、execute:执行单条sql语句,并返回sql语句执行的结果数量
  2、executemany:执行多条sql语句,内部实际是多次调用execute,但是比显示这样调用效率要高一些,返回execute执行成功的数量(实际就是sql语句的sql执行的结果数量。
  当执行更新(插入、修改、删除)操作时,需要通过connection.commit()显示执行提交,才会将execute或者executemany执行的结果,映射到数据库中。
  当执行查询操作时,需要使用cursor.fetchone()、cursor.fetchmany(size), cursor.fetchall(),获取一个、多个、全部sql执行查询的结果。如果使用cursor.frtchmany()默认会获取一个,如果想获取指定个数,那么可以使用cursor.fetchmany(size=2)方式。
  3.4 查询时游标的理解
  3.4.1 游标规则
  如果使用同一个cursor.execute()执行查询结果,初始状态游标执行首个元素,当使用cursor.fetch*时,游标会向下移动;
  cursor.fetchone : 向下移动一个位置
  cursor.fetchmany(size=num) : 向下移动size指定数值位置
  cursor.fetchall() :游标移动到末尾
  例如:
import MySQLdb  

  
if __name__ == "__main__":
  
    # create mysql connection
  
    connection = MySQLdb.connect(host="127.0.0.1", port=3306, user="root", passwd="root", db="test")
  
    # get cursor
  
    cursor = connection.cursor()
  
    # 返回执行结果数
  
    nums = cursor.execute("select * from user")
  
    print(cursor.fetchone())
  
    print(cursor.fetchmany(size=1))
  
    print(cursor.fetchall())
  执行结果:
  (1L, 'admin')
  ((2L, 'wangzp'),)
  ((6L, 'wangzp12'), (5L, 'wangzp123'))
  根据结果可以发现,游标会移动,按照上述描述的规则。
  3.4.2 设置游标位置
  可以通过cursor.scroll(position, mode="relative | absolute")方法,来设置相对位置游标和绝对位置游标。
  方法参数描述:
  position : 游标位置
  mode : 游标位置的模式,relative:默认模式,相对当前位置;absolute:绝对位置
  例如:
  mode=relative, position=1;表示的是设置游标为当前位置+1的位置,即向下移动一个位置
  mode=absolute, position=2;将游标移动到索引为2的位置
  代码示例:
import MySQLdb  

  
if __name__ == "__main__":
  
    # create mysql connection
  
    connection = MySQLdb.connect(host="127.0.0.1", port=3306, user="root", passwd="root", db="test")
  
    # get cursor
  
    cursor = connection.cursor()
  
    # 返回执行结果数
  
    nums = cursor.execute("select * from user")
  
    print(cursor.fetchone()) # 执行后,游标移动到索引位置为1
  
    cursor.scroll(1) # 相对游标移动模式,当前索引+1,即游标位置为2
  
    print(cursor.fetchmany(size=1)) # 因此获取第3个元素
  
    cursor.scroll(0, mode="absolute") # 绝对索引模式,将游标重置为0
  
    print(cursor.fetchall()) # 因此获取所有数据
  运行结果:
  (1L, 'admin')
  ((6L, 'wangzp12'),)
  ((1L, 'admin'), (2L, 'wangzp'), (6L, 'wangzp12'), (5L, 'wangzp123'))
  3.5 事务管理
  使用connection.commit()提交,connection.rollback()回滚。
  总结:
  除了上述一些用法外,还有一些注入执行存储过程等方法,这里不做介绍,详情可以参考相关文档。其实用法相对还是比较简单的。一般开发可以分为如下步骤:
  1、建立数据库连接
  2、获取游标
  3、执行SQL
  4、如果sql是查询,那么使用fetch系列函数查询,但是需要注意的是游标的移动方式。
  如下列一个简单的封装代码(部分):
import MySQLdb  

  
class DBUtil(object):
  

  
    @staticmethod
  
    def getConnection(host, port, user, password, db):
  
        "get mysql connection"
  
        connection = None
  
        try:
  
            connection = MySQLdb.connect(host=host, port=port, user=user, passwd=password, db=db)
  
        except MySQLdb.Error, e:
  
            print(e)
  
        return connection
  

  
    @staticmethod
  
    def getCursor(connection):
  
        "get cursor"
  
        cursor = None
  
        try:
  
            cursor = connection.cursor()
  
        except MySQLdb.Error, e:
  
            print(e)
  
        return cursor
  

  
    @staticmethod
  
    def update(cursor, sql, args):
  
        return cursor.execute(sql, args)
  

  
    @staticmethod
  
    def updateAndCommit(connection, cursor, sql, args):
  
        nums = cursor.execute(sql, args)
  
        connection.commit()
  
        return nums
  

  
    @staticmethod
  
    def updateBatch(cursor, sql, args):
  
        return cursor.executemany(sql, args)
  

  
    @staticmethod
  
    def updateBatchAndCommit(connection, cursor, sql, args):
  
        nums = cursor.executemany(sql, args)
  
        connection.commit()
  
        return nums
  

  
if __name__ == "__main__":
  

  
    connection = DBUtil.getConnection("127.0.0.1", 3306, "root", "root", "test")
  
    cursor = DBUtil.getCursor(connection)
  
    nums = cursor.execute("select * from user")
  
    print(cursor.fetchall())

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-548167-1-1.html 上篇帖子: python:查看linux网卡流量 下篇帖子: Python中子进程Timeout的使用

尚未签到

发表于 2022-8-3 13:15:59 | 显示全部楼层

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表