MySQL数据库(四):python与MySQL的交互

1、python怎么操作MySQL

1.1前言

python相当于一种客户端,用后台语言调用数据库从而进行一系列的操作
MySQL数据库(四):python与MySQL的交互_第1张图片
先创建连接,再获取游标,操作完毕后关闭游标,关闭连接
MySQL数据库(四):python与MySQL的交互_第2张图片

1.2实现步骤

python2:pip install MySQLDB
python3:pip install pymysql

import pymysql


# 1、连接mysql数据库
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='root', db='mytest', charset='utf8')
# 2、获取游标对象
cs = conn.cursor()
# 3、通过游标对象执行sql语句,有返回值,且值为受影响的行数
r = cs.execute('select * from goods;')
print(r)
# 4、通过游标对象获取数据
print(cs.fetchone())  # 第一条数据
print(cs.fetchone())  # 第二条数据
# 获取多条,size=None默认获取一条,以元组形式返回,传入size就返回传入的行数
print(cs.fetchmany(2))
print(cs.fetchall())  # 获取剩下的条数,因为游标动了
print(cs.fetchone())  # 为None因为已经没有要获取的值了
# 关闭游标
cs.close()
# 关闭连接
conn.close()

1.2异常捕获

可以在连接的时候添加异常捕获,防止连接不到数据库直接报错,注意异常捕获中的实例化对象

import pymysql

try:
    conn = pymysql.connect(host='127.0.0.1',port=3306,password='root',user='root',database='mytest',charset='utf8')
except Exception as e: # e=Exception()e是一个实例的过程,虽然打印出来的是元组,但是并不能通过索引取值
    print(e) # 想要拿它里面的参数,可以通过e.args[1]获取
cs = conn.cursor()
result = cs.execute('select * from goods')
print(cs.fetchone())
cs.close()
conn.close()

2、python查询MySQL数据库的案例

2.1通过类初步使用python操作MySQL

1、对象初始化时自动连接数据库连接数据库
2、定义获取单条,所有,多条数据的方法
3、程序结束时自动关闭连接

import pymysql


class MyDb(object):

    def __init__(self):
        self.my_conn()

    def my_conn(self):
        try:
            self.conn = pymysql.connect(host='127.0.0.1', port=3306, password='root', user='root', database='mytest',
                                        charset='utf8')
        except Exception as e:
            print(e)

    def get_one(self):
        cs = self.conn.cursor()
        sql = 'select * from goods'
        cs.execute(sql)
        result = cs.fetchone()
        cs.close()
        return result

    def get_all(self):
        cs = self.conn.cursor()
        sql = 'select * from goods'
        cs.execute(sql)
        result = cs.fetchall()
        cs.close()
        return result

    def get_many(self, size):
        cs = self.conn.cursor()
        sql = 'select * from goods'
        cs.execute(sql)
        result = cs.fetchmany(size)
        cs.close()
        return result

    def close_conn(self):
        # 不需要在此处关闭游标,一是因为他不是类属性,想关可以通过传参,或者定义全局
        # 变量去关,二是可以没调用一次游标方法,他都会重新创建一个游标,所以没必要关
        self.conn.close()

    def __del__(self):  # 这个魔法方法可以在程序执行结束后自动触发,将关闭操作写在这里就不用手动调用了
        self.conn.close()


def main():
    db = MyDb()
    # res = db.get_one()
    # print(res)
    # res = db.get_one()
    # print(res)
    # db.close_conn()
    # res = db.get_all()
    res = db.get_many(3)
    print(res)


if __name__ == '__main__':
    main()

2.2通过类进阶使用python操作MySQL

输入1:查询所有商品
输入2:所有商品种类
输入3:查询所有品牌
输入4:退出
输入5:添加新商品的分类名
注意点:为了代码书写的规范性将不需要self的字段写在静态方法中通过装饰器去引用,将重复代码写在一个方法里面,避免冗余以及方便维护,框架结构一般都是这样一个类一个主函数,一个函数入口,在类的内部实现run方法实现它的逻辑

import pymysql


class MyTest(object):
    def __init__(self):
        self.conn = pymysql.connect(host='127.0.0.1', port=3306, password='root', user='root', database='mytest',
                                    charset='utf8')
        self.cs = self.conn.cursor()

    def show_all_goods(self):
        sql = 'select * from goods;'
        self.execute_aql(sql)

    def show_all_cates(self):
        sql = 'select * from goods_cates;'
        self.execute_aql(sql)
    def add_brands(self):
        name = input('请输入您想添加的商品分类')
        sql = f"insert into goods_cates (name) values ('{name}')"
        self.cs.execute(sql)
        self.conn.commit()

    def show_all_brands(self):
        sql = 'select distinct brand_name from goods;'
        self.execute_aql(sql)

    def run(self):
        while True:
            num = self.print_menu()
            if num == '1':
                self.show_all_goods()
            elif num == '2':
                self.show_all_cates()
            elif num == '3':
                self.show_all_brands()
            elif num == '4':
                break
            elif num == '5':
                self.add_brands()
            else:
                print('输入有误,请重新输入')

    @staticmethod
    def print_menu():
        print('输入1:查询所有商品')
        print('输入2:所有商品种类')
        print('输入3:查询所有品牌')
        print('输入4:退出')
        print('输入5:添加新商品的分类名')
        num = input('请输入您想查询的数字:')
        return num

    def execute_aql(self, sql):
        self.cs.execute(sql)
        res = self.cs.fetchall()
        for data in res:
            print(data)

    def __del__(self):
        self.cs.close()
        self.conn.close()


def main():
    mt = MyTest()
    mt.run()


if __name__ == '__main__':
    main()

3、python修改MySQL数据库的案例

数据的增改删 --> 都是数据的修改
MyISAM --> 这个引擎不需要提交事务就可以修改数据,但是没有那么安全
InnoDB --> 这个引擎需要提交事务才可以修改数据,不提交,也不会报错但也不会修改数据相对安全
注意回滚,当插入语句只要有一句报错,就都不执行

'''
数据 增改删 --> 都是数据的修改
 MyISAM --> 这个引擎不需要提交事务就可以修改数据,但是没有那么安全
 InnoDB  --> 这个引擎需要提交事务才可以修改数据,不提交,也不会报错但也不会修改数据相对安全
 conn.rollback() 实现回滚,多条sql语句同时执行,只要有一条报错,就都不会执行
'''
import pymysql


def coperation_db():
    try:
        conn = pymysql.connect(host='127.0.0.1', port=3306, password='root', user='root', database='mytest',
                               charset='utf8')
        cs = conn.cursor()
        sql = 'insert into student (sid,sname) values(1,"beiyue"),(2,"wchao")'
        cs.execute(sql)
        sql = 'insert into student (sid,sname) values(1,"beiyue"),(2,"wchao")'
        cs.execute(sql)
        # 提交数据,可以同时执行多条inser语句的提交,注意报错之后就不提交了,自上而先,从右往左执行(可以使用异常捕获来健壮代码)
        conn.commit()
        cs.close()
        conn.close()
    except Exception as e:
        print(e)
        # conn.commit()
        conn.rollback()
        cs.close()
        conn.close()


if __name__ == '__main__':
    coperation_db()

你可能感兴趣的:(mysql数据库)