zoukankan      html  css  js  c++  java
  • Mysql存储之原生语句操作(pymysql)

    Mysql存储之原生语句操作(pymysql)

    关系型数据库是基于关系模型的数据库,而关系模型是通过二维表时实现的,于是构成了行列的表结构。
    表可以看作是某个实体的集合,而实体之间存在联系,这个就需要通过表之间的关联关系来体现,比如主键的关联关系,多个表组成了一个数据库,也就是关系型数据库。其中Mysql.oracle,sql server,sqlite等都属于关系型数据库,这里主要说mysql的操作。

    原生语句操作

    所谓的原生语句就是mysql自带的增删改查的语句,即insert,delete,update,select。下面我们用python3为例。
    在python3中数据库的链接一般用pymsql模块。

    第三方库的安装
    pip install pymysql
    
    创建数据库的链接

    前提我们 配置好了mysql数据库,并且安装上了pymysql模块。
    然后我们需要导入pymsql,看下面示例代码:

    conn = pymysql.connect(host='localhost', 
    port=3306, user='root', 
    passwd='1234', db='user', charset='utf8mb4')#声明mysql连接对象
    cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)#查询结果以字典的形式
    cursor.execute(sql语句字符串)#执行sql语句
    conn.close()#关闭链接
    
    事务处理

    事务机制可以确保数据的一致性,如果我们有个逻辑是删除一条数据然后插入,如果我们在插入过程中失败了,那么之前删除的数据没有进行插入,就造成了数据的缺失,为了避免这种缺失情况的发生,我们使用使用来进行统一处理,如果以上操作都成功了才提交,否则回滚,就当什么也没发生一样。用代码就下面的写法

    try:
       cursor.execute(sql)
       conn.commit()
    except:
       conn.rollback()
    
    动态插入数据

    传入一个动态变化的字典即可。

    比如说一开始的时候我们有这样的一个表叫user,需要保存三个字段id,name,age然后我们可以构建下面的字典和表名

    d={'id':'1001','name':'zhangsan','age':'17'}  

    tables='user'
    
    d={'id':'1001','name':'zhangsan','age':'17'}  
     
    tables='user'
    keys=','.join(d.key())
    values=','.join(['%s']*len(d))
    sql=f'INSERT INTO {table}({keys})VALUES({values})'
    try:
       if cursor.execute(sql,tuple(d.values())):
                      print('ok')
                      conn.commit()
    except:
         print('no')
         conn.rollback()
    conn.close()
    

    现在我们就完成了插入操作,但是有的时候我们需要 主键存在是更细,不存在时插入怎么办呢,首先我们看下面语句

    动态更新插入数据
    INSERT INTO user(id,name,age) VALUES(%s,%s,%s) ON DUPLICATE KEY UPDATE id=%s,name=%s,age=%s
    ON DUPLICATE KEY UPDATE 
    

    可以达到以下目的:

    向数据库中插入一条记录:

    若该数据的主键值/ UNIQUE KEY 已经在表中存在,则执行更新操作, 即UPDATE 后面的操作。

    否则插入一条新的记录。

    然后我们对上面整体做一个代码整理。如下

    d={'id':'1001','name':'zhangsan','age':'17'}  
     
    tables = 'name'
    keys = ','.join(data_dic.keys())
    values = ','.join(['%s'] * len(data_dic))
    sql =f'INSERT INTO {tables}({keys})VALUES({values}) ON DUPLICATE KEY UPDATE '
    update = ','.join([f"{k}={v}" for k,v in data_dic.items()])
    sql += update
    try:
       if cursor.execute(sql,tuple(d.values())):
                      print('ok')
                      conn.commit()
    except:
         print('no')
         conn.rollback()
    conn.close()
    
    查询语句

    查询语句就比较简单了用select。下面直接看代码

    sql='select * from user limit 1,10'
    cursor.excute(sql)
    one=cursor.fetchone()
    while one:
       one=cursor.fetchone()  
    #推荐使用while循环配合fetchone读取所有数据,随用随取,效率高。
    
    删除语句

    删除语句用delete语句,但是只要commit里之后才能生效。

    tale='user'
    id='id=123'#可以直接把条件作为字符串传过来。
    sql=f'delete from {table} where {id}'
    try:
        cursor.execute(sql)
        conn.commit()
    except:
        conn.rollback()
    conn.close()
    
  • 相关阅读:
    Java内存模型之从JMM角度分析DCL
    MySQL系列(九)--InnoDB索引原理
    MySQL系列(一)--基础知识(转载)
    MySQL系列(八)--数据库分库分表
    MySQL系列(七)--SQL优化的步骤
    MySQL系列(六)--索引优化
    MySQL系列(五)--二进制日志对主从复制的影响
    Java集合(七)--基于jdk1.8的HashMap源码
    Java数据结构和算法(八)--红黑树与2-3树
    Java数据结构和算法(七)--AVL树
  • 原文地址:https://www.cnblogs.com/c-x-a/p/9293398.html
Copyright © 2011-2022 走看看