Python 操作MySql数据库

python操作mysql数据库需要安装一下库

pip install pymysql
可以通过pip list 查看是否已经安装

操作步骤

#导入包
import pymysql
#链接数据库
dg_config = {
    'host':'ip',
    'port':'端口',
    'user':'账号',
    'password':'密码',
    'db':'数据库名',
    'charset':'utf8',
}
my_conn = pymysql.connect(**dg_config)
  1. 链接数据库

    import pymysql
    #链接数据库
    dg_config = {
        'host':'127.0.0.1',
        'port':'3306',           #默认端口就为3306
        'user':'root',
        'password':'qwe123',
     	'db':'my_workdb',
        'charset':'utf8',
    }
    
  2. 创建链接

    my_conn = pymysql.connect(**dg_config)
    
  3. 创建游标 cursor

    cur = my_conn.cursor()
    
  4. 执行mysql语句cur.excute() 括号内为mysql的增删查改语句

    res = cur.execute("select *from stu_info")
    #res可以获取查询得到的数据
    #以下方式获取结果
    #获取一条数据
    one = cur.fetchone(self)
    #获取制定条数
    many = cur.fetchmany(self,size)
    #获取全部数据
    all = cur.fetchall(self)
    #上述结果可以使用循环打印出来
    for res in all:
        print(res)
    #可以通过逐条获取来获得需要的数据,避免获取所有内存不够
    while one:
        print(one)
        one = fetchone(self)
    
    
  5. 提交数据commit

    my_conn.commit()
    
  6. 关闭游标

    cur.close
    
  7. 关闭链接

    my_conn.close()
    
  8. 上下文管理

    利用上下文管理,可以不用执行关闭游标和关闭链接的操作

    with my_conn.courser() as cur
    	cur.execute("select *from stu_info")
        #执行语句代码块
    
    #提交数据
    my_conn.commit()
    #或者回滚数据
    my_conn.rollback()
    

完整代码如下

import pymysql

class Mysql(object):
    def __init__(self):
        try:
            #打开数据库连接
            #连接数据库所需的值,可以在__init__()中传入
            self.conn = pymysql.connect(
                host = 'localhost',
                port = 3306,
                user = "root",
                passwd = 'root',
                db = "test",
                charset = 'utf8'
            )
        except Exception as e:
            print(e)
        else:
            print("connect successfully")
            # 使用 cursor() 方法创建一个游标对象 cursor
            self.cur = self.conn.cursor()
	#创建表
    def create_table(self):
        try:
            # 使用 execute() 方法执行 SQL,如果表存在则删除
            self.cur.execute("DROP TABLE IF EXISTS EMPLOYEE")
            # 使用预处理语句创建表
            sql = """CREATE TABLE EMPLOYEE (
                   FIRST_NAME  CHAR(20) NOT NULL,
                   LAST_NAME  CHAR(20),
                   AGE INT,  
                   SEX CHAR(1),
                   INCOME FLOAT )"""
            #执行sql语句
            self.cur.execute(sql)
            print("create table success")
        except Exception as e:
            print("create table error\n" + e)

    def add(self):
        #数据库插入语句
        sql = """insert into EMPLOYEE(First_Name,
                Last_Name,Age,Sex,Income) 
                values('Mac','Mohan',20,'F',2000);"""
        try:
            self.cur.execute(sql)
            # 提交到数据库执行
            self.conn.commit()
        except Exception as e:
            print(e)
            # 发生错误时回滚
            self.conn.rollback()
            print("fail to add new data")
        else:
            print("insert data seccess!")

    # Python查询Mysql使用
    # fetchone()方法获取单条数据, 使用fetchall()方法获取多条数据。
    # fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
    # fetchall(): 接收全部的返回结果行.
    # rowcount: 这是一个只读属性,并返回执行execute()
    # 方法后影响的行数。
    def show(self):
        sql = "select * from employee"
        try :
            self.cur.execute(sql)
            #fetchall()返回的结果是list,list里面再嵌套list
            res = self.cur.fetchall()
            for row in res:
                fname = row[0]
                lname = row[1]
                age = row[2]
                sex = row[3]
                income = row[4]

                # 打印结果
                print("\n fname =%s,lname =%s,age = %d, sex=%s,income=%d \n " % (fname, lname, age, sex, income))
        except  Exception as e:
            print(e + "select data fail")
        else:
            print("select data success")

    #更新数据库
    def upodate(self):
        sql = "update employee set age = age + 1 where sex ='%c'" %("m")
        try:
            self.cur.execute(sql)
            self.conn.commit()
        except Exception as e:
            print(e)
        else:
            print("update data success")

    #删除数据库中数据
    def rem(self):
        sql = 'delete from employee where sex = "M"'
        try:
            self.cur.execute(sql)
            self.conn.commit()
        except Exception as e:
            print(e)
        else:
            print("delete data success")

    #关闭数据库连接
    def close(self):
        self.cur.close()
        self.conn.close()
        print("close database success")



if __name__ == "__main__":
    mysql = Mysql()
    mysql.create_table()
    mysql.add()
    mysql.show()
    mysql.upodate()
    mysql.rem()
    mysql.close()

封装示例

我自己写的封装

#把mysql数据表插入一万条数据,这个表结构可以自己定
import pymysql
import logging
from databases.exam.my_imagelogger import My_logger
import random
import string
import re


#py操作mysql数据库
class My_sql(object):
    def __init__(self,host,user,passwd,db,charset='utf8',port=3306,):
        try:
            #打开数据库连接
            #连接数据库所需的值,可以在__init__()中传入
            self.conn = pymysql.connect(
                host = host,
                port = port,
                user = user,
                passwd = passwd,
                db = db,
                charset = charset
            )
            self.logger=My_logger('sql_log',logging.DEBUG,'sql_log.log').create_Logger()
            # self.logger = logging.getLogger('my_log')
        except Exception as e:
            self.logger.error('数据库连接失败,错误内容:{}'.format(e))
        else:
            self.logger.info('数据库连接成功!')
            # 使用 cursor() 方法创建一个游标对象 cursor
            self.cur = self.conn.cursor()

    #添加数据
    def insert_Data(self,sql):
        try:
            self.cur.execute(sql)
            ins = re.findall(r'insert', sql)
            if ins[0] != 'insert':
                raise NameError('这不是查询语句!')
            # 提交到数据库执行
            self.conn.commit()
        except Exception as e:
            # 发生错误时回滚
            self.logger.debug('数据插入失败,错误内容:{}'.format(e))
            self.conn.rollback()
        else:
            self.logger.info('数据插入成功!')

    #查询数据
    def select_Data(self,sql):
        try:
            self.cur.execute(sql)
            ins = re.findall(r'select', sql)
            if ins[0] != 'select':
                raise NameError('这不是查询语句!')
            # fetchall()返回的结果是list,list里面再嵌套list
            results = self.cur.fetchall()
        except Exception as e:
            self.logger.debug('数据查询失败,错误内容:{}'.format(e))
        else:
            self.logger.info('数据查询成功!')
            for res in results:
                print(res)

    #修改数据
    def updata_Data(self,sql):
        try:
            self.cur.execute(sql)
            ins = re.findall(r'updata',sql)
            if ins[0] !='updata':
                raise NameError('这不是修改语句!')
        except Exception as e:
            # 发生错误时回滚
            self.conn.rollback()
            self.logger.debug('数据修改失败,错误内容:{}'.format(e))
        else:
            #提交修改
            self.conn.commit()
            self.logger.info('数据修改成功!')

    #删除数据
    def delete_Data(self,sql):
        try:
            self.cur.execute(sql)
            ins = re.findall(r'delete', sql)
            if ins[0] != 'delete':
                raise NameError('这不是删除语句!')

        except Exception as e:
            # 发生错误时回滚
            self.conn.rollback()
            self.logger.debug('数据删除失败,错误内容:{}'.format(e))
        else:
            self.conn.commit()
            self.logger.info('数据删除成功!')

    #关闭数据库
    def close_Database(self):
        self.cur.close()
        self.conn.close()
        self.logger.info('数据关闭成功!')


if __name__ == '__main__':
    mysqldb = My_sql('127.0.0.1','root','qwe123','my_workdb')
    # mysqldb.select_Data('select *from stu_info')
    #插入一万条学生数据
    #学生id,id自增加
    stu_id = 21
    for i in range(10000):
        stu_id+=1
        #学生名字
        # 随机学生名字
        name = "".join(random.sample(string.ascii_letters, random.randint(3, 7)))
        #学生年龄随机12-40之间
        age = random.randint(12, 40)
        #随机学院id 5个学院  1-5
        col_id = random.randint(1, 5)
        #随机班级,班级也是1-5
        grade = 'class'+ str(random.randint(1, 5))
        #生成插入的sql语句 insert into tb_name values('jiuchen','F',1,18);
        sql = " ".join(['insert into','stu_info','values',str((str(stu_id),name,str(age),str(col_id),grade)),';'])
        print(sql)
        mysqldb.insert_Data(sql)
        # mysqldb.delete_Data('delete from stu_info where stu_id>20; ')

    mysqldb.close_Database()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值