核心任务
- 操作mysql(图形界面)
- 建库建表
- 熟悉:CURD语句
- python操作Mysql [重点]
- 任务: 学生管理系统:数据存储在数据!
连接Mysql建库建表
连接服务器中mysql! 信息: IP: 39.98.39.173 用户名: root 密码: root
1. 图形界面工具: navicate
2.建库
3. 建表
- 分析
# 学生表students # 学生对象包含属性(id,姓名,性别,年龄,生日,手机号,地址...) #根据业务需求随意扩展! # 对应列!
列名 | 类型 | 要求 |
id | int整数 | 主键(primary key)自增 |
name | varcgar(20)字符串 | 必须写字符串大小,不为空! |
sex | char(2) | 性别是固定的字符用char(2) |
age | int整数 | |
phone | varchar(11)字符串 | 186****2688 |
birthday | datetime时间 | |
addr | varchar(50)字符串 |
Python操作数据库
注意:python或任何编程语言php.java..net等,不能直接连接数据库! 需要安装对应的数据库驱动(第三方模块) [比如: 不同品牌手机连接到电脑,需要安装驱动包,才传输数据] 连接不同数据库,需要下载不同的驱动包!
python操作数据库流程
- 下载mysql驱动模块(pymysql)
- 引入模块
- 建连接(建立和数据库连接)
- 执行sql语句
- 非查询:增加,删,修改
- 查询:select
- 处理结果
- 释放资源
- 关连接
- 关游标!
驱动介绍
python操作mysql驱动/第三方模块: MySQLdb PyMysql
- pymysql: 支持2.x 支持3.x
- mysqldb: 只支持3.x
#安装模块 pip install pymysql
增删改
SQL
# 增加 insert into 表名(列1,列2,....) values(值1,值2,...) # 删除 delete from 表名 ; # 删除表中所有数据! delete from 表名 where 条件; # 修改 update 表名 set 列1=值1,列2=值2,....; #不加条件,修改所有列!~ update 表名 set 列1=值1,列2=值2,....where 条件; select * from students where sex ='男'; insert into students(name,sex,age,birthday,phone,addr) values('刘帅','女',20,now(),'17600950805','山西') ; update students set sex='男' where name ='刘帅' delete from students where name ='刘晒'
python实现非查询
- 非查询:步骤一样的!
- 区别: sql语句不同, 参数个数不同!
def my_execute(sql,params): '''非查询通用功能! sql语句, 参数列表''' # 2.连接 conn = pymysql.connect(host='39.98.39.173',port=13306,user='root',passwd='root',db='1909C2',c harset='utf8') print(conn) # 3. 获取游标 cur = conn.cursor() # 4. 执行sql num = cur.execute(sql,params) #print(f'影响行数:{num}') conn.commit() # 必须手动提交到数据库! # 5. 释放资源 cur.close() conn.close() # 返回影响行数! return num if __name__ == '__main__': # 通用 sql ='insert into students(name,sex,age,birthday,phone,addr) values(%s,%s,%s,%s,%s,%s)' params=('王五','女',39,'2020-11-03','17600950805','山西') if my_execute(sql,params)>0: print('数据库操作成功!') else: print('数据库操作失败!')
参数如何传递
sql ='insert into students(name,sex,age,birthday,phone,addr) values(%s,%s,%s,%s,%s,%s)' # 格式:一行数据就是一个元组! params=('王五','女',39,'2020-11-03','17600950805','山西') num = cur.execute(sql,params)
批量执行非查询
sql ='insert into students(name,sex,age,birthday,phone,addr) values(%s,%s,%s,%s,%s,%s)' # 格式:一行数据就是一个元组! params=[('王五1','女',39,'2020-11-03','17600950805','山西'),('王五2','女',39,'2020-11- 03','17600950805','山西')] num = cur.executemany(sql,params) # 结果大于1的
核心对象
- 连接对象: conn= pymysql.connect(host='IP地址',port=13306,user='用户名',passwd='密
- 码',db='数据库名',charset='utf)
- conn.close() #关闭
- cur= conn.cursor() 创建游标
- 游标 Cursor 操作数据库依靠游标!
-
- num = cur.execute(sql,参数) 执行非查询,返回影响的行数!
- num=cur.executemangy(sql,[(),(),..]) 批量执行非查询,返回影响行数!
- cur.close()
- cur.fetchone() 抓取1条,,返回元组或None
- cur.fetchall() 抓取所有
- cur.fetchmany(大小) 指定抓取大小
- cur.next() 游标下移!
查询
import pymysql def get_one(): # 1. 连接 conn = pymysql.connect(host='39.98.39.173', port=13306, user='root', passwd='root', db='1909C2', charset='utf8') # 2. 打开游标 cur = conn.cursor() # 3. 执行 sql ='select * from students where sex = %s' cur.execute(sql,('女')) #result = cur.fetchone() # 返回一个元组() 默认找第1个! result = cur.fetchall() # 返回多个元祖 ((),(),(),...) print(result) for stu in result: print(f'id:{stu[0]},名字:{stu[1]}') # 4.关闭资源 cur.close() conn.close() if __name__ == '__main__': get_one()