Python 数据库操作

Stella981
• 阅读 709

Python 数据库操作

一、前言

数据库是应用程序保存数据的一个重要手段,因此学习python语言的数据库操作也是非常重要的内容。今天我们就来分享pymysql模块的使用。

二、数据库基本操作

2.1 安装 PyMySQL 模块

我使用的是 Python 3.x 版本,我们可以通过 pip 直接安装:

pip install pymysql

也可以选择先去 https://pypi.org/project/PyMySQL/#files [1]下载 whl 文件,点击红框部分:

Python 数据库操作

我把下载好的文件放到桌面,然后在 cmd 中进入桌面文件夹,输入如下语句:

pip install PyMySQL-0.9.3-py2.py3-none-any.whl

其中 install 为文件的全名,我们可以直接输入 pip install PyMy 然后按 Tab 自动补全。这样我们的模块就安装好了。

2.2 连接数据库和简单操作

连接数据库非常简单,一个最简单的数据库操作步骤如下:

•获取本地 IP•连接数据库•获取数据库游标•数据库操作•关闭游标和数据库连接

在具体操作之前,我们先创建一个数据库,后续所有案例都会在该数据库中进行。我们先进入 MySQL,执行如下语句:

create database pydb;

接下来我们就可以开始操作数据库了,代码实现如下:

import pymysql, socket

这样我们就在数据库中创建了一个 user 表了,我们可以查询一下:

use pydb;

结果如下:

+----------+-------------+------+-----+---------+-------+

2.3 添加数据

添加数据和上面的操作大致一样,除了 SQL 语句不同外,我们还需要提交对数据库进行的操作。其步骤如下:

•获取本地 IP•连接数据库•获取数据库游标•数据库操作•提交已经进行的操作•关闭游标和数据库连接

这里加了一个步骤,其余都是相同的。代码如下:

import pymysql, socket

大部分代码都一样,其中添加了如下一句代码:

conn.commit()

其作用就是提交你开始执行的 SQL 语句,执行该语句后数据库中的数据会发生相应的变化。

2.4 删除数据和修改数据

因为要删除数据,我们先在数据库中添加一些数据:

insert into user values('rudy', '123456');

在控制台中进入 MySQL 环境,执行上面语句,然后我们再查询一下数据库中的数据,语句如下:

select * from user;

执行后结果如下:

+-------+----------+

接下来我们就可以进行删除操作了。代码如下:

import pymysql, socket

大致代码都没有改变,我们在执行 SQL 语句时使用 num 接收了 execute() 的返回值。该返回值为被删除/修改数据的数量。执行上面代码后我们再查询数据,发现 password 为 1111 的数据全被删除了。且原本 name 为 zack 的数据被修改为 zax。

2.5 查询数据

查询数据和之前的操作有了些许区别,其中我们主要会使用到 cursor 的两个个方法。各方法解释如下:

方法名称

返回值类型

返回值解释

fetchone()

元组

返回下一行数据的结果集

fetchall()

二元组

返回所有数据

了解上面两个方法后我们就可以开始进行查询操作了。我们先使用查询一行数据的方法 fetchone():

import pymysql, socket

我们调用 m_cursor.fetchone() 方法,获取一条结果的元组。因为是第一次调用,所以返回的是第一行数据,如果再次调用将返回第二行数据。上面代码输出如下:

用户名:zax....密码:123456

我们还可以遍历每个结果。我们将获取下一行数据部分修改成如下:

# 获取第一行数据

修改后输出结果如下:

用户名:zax....密码:123456

当然,我们还可以直接使用 fetchall() 方法,改方法返回数据为二元组,我们将代码修改为如下:

# 获取查询的所有数据

这样我们就完成了我们的查询操作。

三、事务执行

在开始事务的讲解之前,我们先准备好另外一张表 bank:

create table bank(

这是一张银行账户表,我们把用户名设置为主键。我们事先添加两条数据:

insert into bank values('zack', '123456', '2000');

下面我们来实现这么一个功能,就是让 rudy 给 zack 转账 100 元。那么我们需要执行如下步骤:

•将 zack 的钱增加 100•将 rudy 的钱减少 100

接下来我们用代码来实现一下以上功能:

import pymysql, socket

注意:上面部分 SQL 语句我使用了字符串拼接的方式,这里需要注意的是在拼接 varchar 数据类型时,需要添加单引号。

接下来我们看一看,执行上面代码后我们再查询一下数据库中的数据:

+------+----------+-------+

数据已经修改了,但是还有个问题。现在 rudy 只有 100 元,如果再让 rudy 给 zack 转账 200 元。这样的话上述代码还是会正常执行的,但是现实生活中是不允许的,所有我们需要将转账部分的代码放入 try 中,当余额不足时抛出异常。为了方便,我们将转账部分代码抽出函数 transferAccounts(),函数具体代码如下:

def transferAccounts(cursor, user1, user2, money):

我们在取钱的时候对修改后的金额进行判断,如果为 0 我们就抛出异常。然后我们主体部分代码可以修改为如下:

# 省略获取连接和游标部分代码

我们让 rudy 给 zack 转账 200,但是实际上 rudy 只有 100 元,这个时候就会产生异常。执行结果如下:

交易失败,失败信息:money is not enough

然后我们查询一下数据库中的数据:

+------+----------+-------+

发现 zack 的钱增加了,但是 rudy 钱并没有减。我们来详细说一下这个过程到底发生了什么:

1.在我们获取连接时,该数据库默认开启了事务2.我们在事务中添加了给 zack 加钱的操作3.在执行给 rudy 减钱的操作时发生异常,该操作并未添加到事务当中4.在最后我们提交事务中的操作,即给 zack 加钱的操作

由上面的操作可知,我们只给 zack 加了钱,而没有给 rudy 减钱。这种亏本的生意银行可不会做,这个时候我们就要介绍一个和 commit() 息息相关的函数 rollback() 了。rollback() 的作用是回滚已经添加的操作。我们将代码修改为如下:

# 省略获取连接和游标部分代码

到此,事务就讲完了。

四、实现简单登陆注册

在进行下面的讲解前,我们先删除原先的 user 表:

drop table user;

然后我们执行下列语句,创建一个新的 user 表:

create table user(

然后我们就可以继续下面的讲解了。

4.1 图形界面

因为图形界面不是本次 Chat 的重点,所以这里不会对图形界面进行过多的讲解,只会提到一些简单的东西。首先这里选用的是 tkinter 模块。我们实现一个简单的界面,具体代码如下:

from tkinter import *

上面代码每句都有相应的注释。其中有三个方法:login、register、on_closing。这三个方法的方法体是空的,其内容放到后面讲解。另外我们导入了一个 dbutils 模块。该模块是自己编写的一个简单模块,后续会大家讲解。因为没有做过多的调整,所以界面比较紧凑,运行后展示界面如下:

Python 数据库操作

4.2 dbutils 模块

实际上一个模块就是一个 py 文件,我们在项目的根目录下创建一个** dbutils.py** 文件。然后我们开始代码部分的编写:

import pymysql, socket

4.3 login 函数

接下来我们来看看我们应该如何响应登陆按钮。大致登陆流程如下:

flowchat

我们用代码实现上面的流程图:

def login():

这样我们就实现了登陆的功能。因为没有对数据进行修改,所以不需要进行异常代码捕获。接下来我们看一看注册的流程。

4.4 register 函数

注册的判断和登陆有许多相似的地方,我们先看一下注册的流程图:

flowchat

前面的步骤是一样的,就是第二个判断改成了判断输入的用户名是否为新用户。我们用代码实现上面流程图:

def register():

4.5 on_closing 函数

最后就是我们的窗口关闭响应函数 on_closing,这里非常简单:

def on_closing():

这里我们就是做了一些收尾工作,将数据库相关东西关闭,然后关闭窗口。

References

[1] https://pypi.org/project/PyMySQL/#fileshttps://pypi.org/project/PyMySQL/#files

本文分享自微信公众号 - ZackSock(ZackSock)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Java修道之路,问鼎巅峰,我辈代码修仙法力齐天
<center<fontcolor00FF7Fsize5face"黑体"代码尽头谁为峰,一见秃头道成空。</font<center<fontcolor00FF00size5face"黑体"编程修真路破折,一步一劫渡飞升。</font众所周知,编程修真有八大境界:1.Javase练气筑基2.数据库结丹3.web前端元婴4.Jav
Karen110 Karen110
3年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这