ParisGabriel
 
 
         每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰
 
  开局一张图
 
 
存储引擎(处理表的处理器)
    基本操作:
        查看所有存储引擎
          show engines;
        查看已有表的存储引擎
  show create table 表名;
创建表指定引擎
  create table 表名()engine=myisam;
已有表添加引擎
  alter table 表名 engine=innodb;
MySQL锁:(自动加锁)
  目的:解决客户端并发访问的冲突问题
  锁分类:
     类型:
        1.读锁(共享锁)
  select :加读锁后别人不能更改表记录,但可以查询
2.写锁(互次锁、排他锁)
          insert、delete、update
  加写锁后别人不能查也不能改
     锁粒度:
        1.表级锁:myisam
1.行级锁:innodb
常用的存储引擎特点
  InnoDB特点:
     1.共享表空间
       表名.frm:表结构和索引文件
       表名.idb:表记录、
       支持行级锁
       支持外键、事物操作
  Myisam特点:
       独享表空间
         表名.frm:表结构
 表名.myd:表记录mydata
 表名.myi:索引文件 myindex
       支持表级锁
如何决定使用哪个存储引擎?
      执行查询操作多的表用MyISAM(使用InoDB浪费资源)
      执行写操作多的表用InnoDB
MySQL调优:
     1.选择合适的存储引擎
        读操作多:MyISAM
写操作多:InnoDB
     2.创建索引
        在select、where、order by 经常涉及到的字段建立索引
     3.SQL语句优化
        1).where子句中尽量不使用 != 否则放弃索引全表扫描
2).尽量避免 NULL 值判断 否则放弃索引全表扫描
  优化前:
      select number from t1 where number isnull;
          优化后:
      在number列上设置默认值0,确保number列无NULL值
      select number from t1 where number=0;
3).尽量避免 or 连接条件,否则放弃索引全表扫描
  优化前:
      select id from t1 where id=0 or id=20;
  优化后:
      select id from t1 where id=10
      union all
      select id from t1 where id=20
      union all
      select id from t1 where id=30;
      union all:
         将查询结果连接起来
        4).模糊查询尽量避免使用前置%,否者全表扫描
      select name from t1 where name like “%c%”;
5).尽量避免使用 in 和 not in 否则全表扫描
  优化前:
      select id from t1 where id in(1,2,3,4);
  优化后:
      select id from t1 where id between 1 and 4;
6).尽量避免使用* 不要返回任何用不到的字段
 
事物和事物回滚
     定义:一件事从开始发生到结束的整个过程
     作用:确保数据的一致性
     事物和事物回滚应用
         MySQL中SQL命令会自动commit到数据库
 show variables like“autocommit”
     事物应用:
        开始事物
   begin;此时autocommit被禁用
        事物提交
           commit
终止事物
   rollback;
 
与python交互:
   交互类型
   python3:pymysql 模块
   安装:
     在线:sudo pip3 install pymysql
     离线:pymysql-0.7.11.tar.gz
           tar -zxvf pymysql-0.7.11.tar.gz
   cd pymysql-0.7.11
   sudo python3 setup.py install
    python2: 模块:MySQLdb
       安装:sudo pip install mysql-python
 
 
 
pymysql使用流程:
    1.建立数据库链接:(db = pymysql.connect(....))
    2.创建游标对象:(c = db.cursor())
    3.游标方法:(c.execute(“insert .....”))
    4.提交到数据库:db.commit()
    5.关闭游标对象:c.close()
    6.断开数据库链接:db.close()
     connect对象:
        db = pymysql.connect(参数列表)
1.host:主机地址,本地 localhost
2.port:端口,默认3306,8080(可省略)
3.user:用户名
4.password:密码
5.database:库
6.charset:编码方式,推荐使用utf8
数据库链接对象(db)的方法:
    1.db.close() 关闭链接
    2.db.commit()提交到数据库
    3.db.rollback()回滚
    4.cur = db.cursor()返回游标对象,用于执行具体SQL命名
      游标对象(cur)的方法:
          1.cur.execute(SQL命令,[列表])执行SQL命令
  2.cur.close()关闭游标对象
          3.cur.fetchone()获取查询结果的第一条数据
  4.cur.fetchmany(n)获取n条记录
  5.cur.fetchall()获取所有记录
示例:
 
增、删、改、查、参数化
# frist.py
import pymysql # 创建数据库对象
db = pymysql.connect(host="localhost", user="root",
password="", database="db4",
charset="utf8")
# 利用db方法创建游标对象
cur = db.cursor() # 利用游标对象的execute()方法执行SQL命令
cur.execute("insert into sheng values\
(16,300000,'台湾省');")
# 提交到数据库
db.commit()
# 关闭游标对象
cur.close()
# 断开数据库链接
db.close() # 增 删 改 import pymysql
# 创建数据库链接
# 链接到db4库
db = pymysql.connect(host="localhost", user="root",
password="", database="db4",
charset="utf8") # 创建游标
cur = db.cursor()
try:
# 添加记录
cur.execute("insert into sheng values (17,168800,'浙江');")
# 修改记录
cur.execute("update sheng set id=666 where id=17;")
# 删除记录
cur.execute("delete from sheng where s_name='浙江';")
# 截获EXception类型错误
except Exception as e:
# 出现异常后回滚
db.rollback()
# 输出错误
print("Error ", e)
else:
# 提交数据
db.commit() # 关闭游标
cur.close()
# 断开数据库链接
db.close() # 查询 import pymysql
# 创建数据库链接
db = pymysql.connect(host="localhost", user="root",
password="", database="db4",
charset="utf8")
# 创建游标
cur = db.cursor()
try:
# 查找
cur.execute("select * from sheng;")
# 取出一条记录就少一条
print("***************************")
data1 = cur.fetchone()
print(data1)
print("***************************")
data2 = cur.fetchmany(3)
for i in data2:
print(i)
print("***************************")
# 遍历取出数据
data3 = cur.fetchall()
for x in data3:
print(x)
# 提交数据
db.commit() except Exception as e:
db.rollback()
print("Error ", e) # 关闭游标
cur.close()
# 断开数据库链接
db.close() # 参数化 import pymysql
# 创建数据库链接
db = pymysql.connect(host="localhost", user="root",
password="", database="db4",
charset="utf8")
# 创建游标
cur = db.cursor()
try:
s_id = input("请输入省的编号")
s_name = input("请输入省的名字")
# 用占位符参数化数据
sql_insert = "insert into sheng(s_id,s_name) values(%s,%s)"
# execute方法 传参必须是列表
cur.execute(sql_insert, [s_id, s_name]) # 提交数据
db.commit() except Exception as e:
db.rollback()
print("Error ", e) # 关闭游标
cur.close()
# 断开数据库链接
db.close()
 
封装类

# mysqlpython.py

# 导入mysql模块
from pymysql import * class MysqlPython:
def __init__(self, database, # 库
host="127.0.0.1", # ip地址
user="root", # 用户名
password="", # 密码
port=3306, # 端口
charset="utf8"): # 字符集
self.host = host
self.database = database
self.user = user
self.password = password
self.port = port
self.charset = charset def open(self): # 创建数据库链接函数
self.db = connect(host=self.host,
database=self.database,
user=self.user,
password=self.password,
port=self.port,
charset=self.charset)
self.cur = self.db.cursor() # 创建游标对象 def close(self): # 创建断开数据库链接 关闭游标函数
self.cur.close()
self.db.close() def zhixing(self, sql, L=[]): # 创建pymysql.execute() 方法函数
try:
self.open() # 链接数据库
self.cur.execute(sql, L) # 参数化执行SQL命令
self.db.commit() # 提交数据
print("ok")
except Exception as e:
self.db.rollback() # 出错取消提交
print("Failed", e)
self.close() # 断开数据库链接 关闭游标 def all(self, sql, L=[]):
try:
self.open()
self.cur.execute(sql, L)
result = self.cur.fetchall()
return result
except Exception as e:
print("Failed", e)
self.close()
 

调用模块.类

  # frist.py

from mysqlpython import MysqlPython
# 创建数据库链接
sqlh = MysqlPython("db4")
# 创建数据库对象
sql_update = "update sheng set s_name='辽宁省'\
where s_name='云南省';" # 调用xiugai函数 执行SQL命令:sql_update
sqlh.zhixing(sql_update) sql_select = "select * from sheng where id=%s;" # 调用all函数 执行SQL命令:sql_select
date = sqlh.all(sql_select, [1])
print(date)

用户登录系统示例:

from mysqlpython import Mysqlpython
from hashlib import sha1 uname = input("请输入用户名:")
pwd = input("请输入密码:")
# 用sha1给pwd加密 s1 = sha1() # 创建sha1加密对象
s1.update(pwd.encode("utf8")) # 指定编码
pwd2 = s1.hexdigest() # 返回16进制加密结果 sqlh = Mysqlpython("db4")
select = "select password from user where \
username=%s;"
result = sqlh.all(select, [uname])
# print(result)
# (('7c4a8d09ca3762af61e59520943dc26494f8941b',),) if len(result) == 0:
print("用户名不存在")
elif result[0][0] == pwd2:
print("登录成功")
else:
print("密码错误")
 
orm(Object Relation Mapping)对象关系映射
    1.定义
       把对象模型映射到MySQL数据库中
 2、sqlalchemy安装:
    在线 :sudo pip3 install sqlalchemy
    离线 :
      $ tar -zxvf SQLAlchemy-1.2.10.tar.gz
      $ cd SQLAlchemy-1.2.10
      $ sudo python3 setup.py install
    验证:
      $ python3
      >>> import sqlalchemy
      >>> 
 
 

 orm

# 创建一张表

# 连接数据库的模块
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String engine = create_engine("mysql+pymysql://root:123456@localhost/db4", encoding="utf8")
Base = declarative_base() # orm基类 class User(Base): # 继承Base基类
__tablename__ = "t123"
id = Column(Integer, primary_key=True)
name = Column(String(20))
address = Column(String(40)) Base.metadata.create_all(engine)
 
ER模型:
    定义: 关系模型 用于数据库设计
三个概念
  1.实体:矩形框
  2.属性:椭圆形
  3.椭圆形:实体之间的关系
       1).一对一关系(1:1)
       2).一对多关系(1:n)
       3).多对多关系(m,n)
 

Python全栈 MySQL 数据库 (引擎、事物、pymysql模块、orm)的更多相关文章

  1. Python全栈 MySQL 数据库(SQL命令大全、MySQL 、Python调用)

    为了梦想与了信仰    开局一张图   主要三个方面: 1.Linux终端命令 2.MySQL语句 3.Python调用   先删库 再跑路.....                         ...

  2. Python全栈 MySQL 数据库 (简述 、安装、基本命令)

    ParisGabriel              每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰    开局一张图     一个月的python已经结束了  下面就是数据库了   先说M ...

  3. Python全栈 MySQL 数据库 (索引、数据导入、导出)

    ParisGabriel              每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰    开局一张图     表字段重命名(change)   alter table 表名 ...

  4. Python全栈 MySQL 数据库 (SQL查询、备份、恢复、授权)

    ParisGabriel              每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰    开局一张图   今天接着昨天的说   索引有4种:      普通 索引 :ind ...

  5. Python全栈 MySQL 数据库 (表字段增、删、改、查、函数)

    ParisGabriel              每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰    开局一张图         查询SQL变量 show variables 1.表字 ...

  6. [MySQL数据库之Navicat.pymysql模块、视图、触发器、存储过程、函数、流程控制]

    [MySQL数据库之Navicat.pymysql模块.视图.触发器.存储过程.函数.流程控制] Navicat Navicat是一套快速.可靠并价格相当便宜的数据库管理工具,专为简化数据库的管理及降 ...

  7. Python全栈 MongoDB 数据库(概念、安装、创建数据)

    什么是关系型数据库?           是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据,             同时也是一个被组织成一组拥有正式描述性的表格( ...

  8. python 全栈开发,Day25(复习,序列化模块json,pickle,shelve,hashlib模块)

    一.复习 反射 必须会 必须能看懂 必须知道在哪儿用 hasattr getattr setattr delattr内置方法 必须能看懂 能用尽量用__len__ len(obj)的结果依赖于obj. ...

  9. MySQL数据库篇之pymysql模块的使用

    主要内容: 一.pymysql模块的使用 二.pymysq模块增删改查 1️⃣  pymsql模块的使用 1.前言:之前我们都是通过MySQL自带的命令行客户端工具mysql来操作数据库, 那如何在p ...

随机推荐

  1. 【[TJOI2017]DNA】

    [题目][https://www.lydsy.com/JudgeOnline/problem.php?id=4892] 好像用\(SAM\)做的都是\(dfs\)啊 其实这里也是搜索 如果用\(SAM ...

  2. C#中类的成员

    一.C#中类的成员 1. 类的成员 类中的数据和函数都称为类的成员.类的成员可以分为两类: ?类本身所声明的. ?从基类中继承来的. 如果在类声明中没有指定基类,则该类将继承System.Object ...

  3. 【iOS】史上最全的iOS持续集成教程 (下)

    :first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...

  4. 微信小程序日期选择器

    /* JS代码部分 */ const date = new Date() const years = [] const months = [] const days = [] const hours ...

  5. vue2.0之监听属性的使用心得及搭配计算属性的使用

    我们在工作中常常需要监听某一个属性值的变化,这个时候我们就需要用到了监听属性watch,在这里我总结watch属性的三种场景使用希望对你有所帮助: 1.基础版监听: 场景如下:输入框输入你的年龄,如果 ...

  6. Linux-日期时间相关命令

    获取当前时间 date [root@VM_0_3_centos ~]# date Mon Mar 18 19:13:33 CST 2019 [root@VM_0_3_centos ~]# date相关 ...

  7. float元素浮动后高度不一致导致错位的解决办方法

    换行开始的第一个元素clear:left;即可 例如  四列时应该时第5个,9个...加clear:left; .row .col-lg-3:nth-child(4n+1),.row .col-md- ...

  8. vim编辑器使用习惯问题

    Ubuntu中vi在编辑状态下方向键不能用,一按方向键盘就出ABCD,想插入个字母还非常麻烦,还有回格键不能删除等我们平时习惯的一些键都不能使用. 解决办法: 可以安装vim full版本,在full ...

  9. 数据分析处理库Pandas——数值运算

    求和 对每行或每列求和. 均值 对每行或每列求均值. 最大最小值 对每行或每列求最大值或最小值. 中位数 对每行或每列求中位数. 相关系数和协方差 先导入一个DataFram结构的数据,再对这些数据计 ...

  10. POJ:3579-Median(二分+尺取寻找中位数)

    Median Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9201 Accepted: 3209 Description Gi ...