python数据库调用_【pymysql】00--python调用mysql数据库

文章导读:

数据库是为python开发服务的,那我们的python如何去调用mysql数据库呢?

本文解决问题:

1、python调用数据库(增删改)

2、事务的使用(增删改都要加入事务)

3、事务的四大特性

4、MySQL触发器、MySQL函数、游标

调用mysql数据库大致流程:1、安装          pip installl pymysql

2、导入模块(驱动)

3、获取连接

4、获取游标

5、执行sql语句

6、关闭资源      (mysql链接是有限制的,官方说同时可以链接10000个)

注意的是:mysql的并发量是有限的。并发量就是能够连接mysql数据库的连接数,最多两三千条。(并发量问题引出)环境要求:

•Python2使用mysqldb模块调用【未测】

•Python3使用pymysql模块调用【本文环境】

•使用pymsql完成对数据库表的CRUD

•完成一个sqlHelper工具类的封装

咱们Windows下进行调用一下:

===================1、python调用数据库(增删改)===============

1、导入模块:

我们的电脑只安装了python3.5,使用这个命令就行,如果电脑同时有多个python解析器的话,

关系型数据库,得用游标。

封装成元组,整体封装成大元组。游标,游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。我们知道关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where 子句来限制只有一条记录被选中。因此我们必须借助于游标来进行面向单条记录的数据处理查询单条信息

抓取一条信息。一般我们不这样写,引起sql注入漏洞。

正解。注意的是,如果我们还是查询表中所有的数据,不按照id指定,同时sql语句执行一条,那么返回的是第一条数据,不会报错。登陆注册演示(老师的代码,因为我的没有password字段)

如果登陆成功,就返回数据,如果登录不成功,就返回None。增加

修改

事务,在后面有讲解。

=========================2、事务的介绍===========================

2.1、如何理解事务?

生活情境:

如下,老王转钱给小王,这是正常操作,执行两个语句:发送和接收。但是,突然断电了或者出现什么意外了,第一条语句执行了,第二条没有执行。此时的情况是老王钱出去了,小王因为事故没有收到钱。

2.2、事务:

一种保护机制(所有sql语句执行完之后再统一去提交数据,就算失败,发条信息提醒不会让这个生效,造成财产安全)

事务由一条或者多条sql语句组成,在事务中的操作,这些sql语句要么都执行,要么都不执行,这就是事务的目的。事务需要满足ACID特性代码在调用的时候,不会默认去执行这个事务,需要自己手动写。

没啥,就是把事务放在执行sql语句之后。

这个应该是前面进行了一次删除操作,所以id是38。

==================3、事物的四大特性====================ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。

原子性:

整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

(原子性指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,整个事务的执行才算成功。事务中任何一个sql语句执行失败,那么已经执行成功的sql语句也必须撤销,数据库状态应该退回到执行事务前的状态;)

一致性:

一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。

也就是说:如果事务是并发多个,系统也必须如同串行事务一样操作。其主要特征是保护性和不变性(Preserving an Invariant),以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性

(一致性指事务将数据库从一种状态转变为另一种一致的状态,在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏;)

隔离性:

隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

(隔离性也叫做并发控制或者锁,要求每个读写事务的对象与其它事务的操作对象能相互分离,即该事务提交前对其它事务都不可见,这通常配合锁机制来实现;)

持久性:

在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

(持久性是表示事务一旦提交了,其结果就是永久性的,也就是数据就已经写入到数据库了,如果发生了宕机等事故,数据库也能将数据恢复。)

备注资料:

由于一项操作通常会包含许多子操作,而这些子操作可能会因为硬件的损坏或其他因素产生问题,要正确实现ACID并不容易。ACID建议数据库将所有需要更新以及修改的资料一次操作完毕,但实际上并不可行。目前主要有两种方式实现ACID:第一种是Write ahead logging,也就是日志式的方式(现代数据库均基于这种方式)。第二种是Shadow paging。相对于WAL(write ahead logging)技术,shadow paging技术实现起来比较简单,消除了写日志记录的开销恢复的速度也快(不需要redo和undo)。shadow paging的缺点就是事务提交时要输出多个块,这使得提交的开销很大,而且以块为单位,很难应用到允许多个事务并发执行的情况——这是它致命的缺点。WAL 的中心思想是对数据文件的修改(它们是表和索引的载体)必须是只能发生在这些修改已经 记录了日志之后 -- 也就是说,在日志记录冲刷到永久存储器之后.如果我们遵循这个过程,那么我们就不需要在每次事务提交的时候 都把数据页冲刷到磁盘,因为我们知道在出现崩溃的情况下,我们可以用日志来恢复数据库:任何尚未附加到数据页的记录 都将先从日志记录中重做(这叫向前滚动恢复,也叫做 REDO)然后那些未提交的事务做的修改将被从数据页中删除 (这叫向后滚动恢复 - UNDO)。

======>>>与锁配合实现隔离性:

Mysql使用事务时会发生脏读和幻读问题

脏读:是指当一个事务正在访问数据,并且对数据进行了修改,在提交之前,另外一个进程恰好读取这个数据,这个进程读取的和commit之后的数据就不一致了。

幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么第一个事务的用户commit之后就会发现表中还有没有修改的数据行,就好象发生了幻觉一样。所以需要对第一个事务操作的对象加写锁,阻塞其他事务的读写请求。

================4、mysql触发器:======================

可以看做自动执行的存储过程,当触发器被指定的事件激活后,就会执行一系列SQL指令,这些指令在BEGIN和END之间,并支持逻辑代码如流程控制。

============5、mysql函数:有内置函数和自定义函数==========

======================6、游标问题====================有数据缓冲的思想:游标的设计是一种数据缓冲区的思想,用来存放SQL语句执行的结果。

先有数据基础:游标是在先从数据表中检索出数据之后才能继续灵活操作的技术。

类似于指针:游标类似于指向数据结构堆栈中的指针,用来pop出所指向的数据,并且只能每次取一个。

(1)游标的优点:

因为游标是针对行操作的,所以对从数据库中select查询得到的每一行可以进行分开的独立的相同或不同的操作,是一种分离的思想。可以满足对某个结果行进行特殊的操作。 游标与基于游标位置的增删改查能力。 MySQL数据库中没有专门描述一行的表达形式,但这是需要的,所以,个人理解的话,我觉得游标是在关系数据库这种面向集合的系统中抽离出来,单独针对行进行表达(也可以理解成网上资料说的:游标是面向集合与面向行的设计思想之间的一种桥梁)

(2)游标缺点

游标的缺点是针对有点而言的,也就是只能一行一行操作,在数据量大的情况下,是不适用的,速度过慢。这里有个比喻就是:当你去ATM存钱是希望一次性存完呢,还是100一张一张的存,这里的100一张一张存就是游标针对行的操作。 数据库大部分是面对集合的,业务会比较复杂,而游标使用会有死锁,影响其他的业务操作,不可取。 当数据量大时,使用游标会造成内存不足现象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 MySQL 触发器中调用 Python 脚本,你可以使用以下步骤: 1. 在 MySQL 中创建一个触发器,以便在特定事件发生时触发执行 Python 脚本。 2. 在 Python 中编写脚本,以便执行所需的操作。你可以使用 PythonMySQL 连接库(如 PyMySQL)与 MySQL 进行交互。 3. 在触发器中调用 Python 脚本,可以通过 shell 命令调用 Python 解释器来实现。例如,在 Linux 系统上,你可以使用以下命令: ``` `/usr/bin/python /path/to/your/python/script.py` ``` 4. 将该命令作为 MySQL 触发器中的 shell 命令调用即可。 需要注意的是,如果你的 Python 脚本需要接收参数,你需要在触发器中将这些参数传递给 shell 命令。可以使用 MySQL 的 `CONCAT()` 函数将参数拼接成字符串,然后在 shell 命令中解析这个字符串。 示例代码如下: ```mysql CREATE TRIGGER `my_trigger` AFTER INSERT ON `my_table` FOR EACH ROW BEGIN SET @args = CONCAT('arg1', ' ', 'arg2', ' ', NEW.`column`); SET @cmd = CONCAT('/usr/bin/python /path/to/your/python/script.py', ' ', @args); SET @result = sys_exec(@cmd); END; ``` 在这个示例中,我们创建了一个名为 `my_trigger` 的触发器,它会在 `my_table` 表中插入新行后触发。在触发器中,我们使用 `CONCAT()` 函数将三个参数拼接成字符串,并将其存储在变量 `@args` 中。然后,我们使用 `CONCAT()` 函数将 Python 解释器路径和脚本路径与 `@args` 拼接起来,存储在变量 `@cmd` 中。最后,我们调用 MySQL 的 `sys_exec()` 函数来执行 shell 命令并将结果存储在变量 `@result` 中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值