python 为多数的db实现了接口,使用它连接各种数据库后,就可以以相同的方式操作数据库,流程为:
- 引入模块
- 获取与数据库的连接
- 执行sql语句和存储过程
- 关闭数据库连接
安装mysqldb
- python3直接使用pip install pymysql就能直接安装使用了
- python2要安装msyqldb,需要去官网下载mysqldb的源码包进行安装
mysql事务
一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
-
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
-
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
-
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
-
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
mysql常用操作
- 授权用户grant all on *.* to 'user1' identified by 'passwd';
- 查询库 show databases;
- 切换库 use mysql;
- 查看库里的表 show tables;
- 查看表里的字段 desc tb_name;
- 查看建表语句 show create table tb_name\G;
- 查看当前用户 select user();
- 查看当前使用的数据库 select databsase();
- 创建库 create database db1;
- 创建表 use db1; create table t1(`id` int(4), `name` char(40));
- 查看当前数据库版本 select version();
- 查看数据库状态 show status;
- 查看各参数 show variables; show variables like 'max_connect%';
- 修改参数 set global max_connect_errors=1000;#重启不生效,要修改my.cnf文件
- 查看队列 show processlist; show full processlist;
- 删除表: drop table;
常用sql语句
- select count(*) from mysql.user; # 查看mysql库的user表的行数
- select * from mysql.db;
- select db from mysql.db;
- select db,user from mysql.db;
- select * from mysql.db where host like '192.168.%'; # 支持模糊查询
- insert into db1.t1 values (1, 'abc');
- update db1.t1 set name='aaa' where id=1; # 更改数据
- truncate table db1.t1; # 清空一个表,但是字段还在,表结构还在
- drop table db1.t1; # 连结构和数据一起清空
- drop database db1; # 删除数据库db1
更改密码
- /usr/local/mysql/bin/mysql -uroot
- 更改环境变量PATH,增加mysql绝对路径
- export PATH=$PATH:/usr/local/mysql/bin/ # 临时
- 编辑/etc/profile,在最后添加: export PATH=$PATH:/usr/local/mysql/bin/ 保存退出,执行source /etc/profile # 永久
- mysqladmin -uroot password '123456' # 设置mysql的root用户密码,此root和系统的root用户不同
- mysql -uroot -p123456
- 密码重置
- vi /etc/my.cnf//增加skip-grant
- 重启mysql服务 /etc/init.d/mysqld restart
- mysql -uroot
- use mysql;
- update user set password=password('aminglinux') where user='root';
mysql的连接
-
创建数据库
create database python;
-
授权
grant all on python.* to 'Bill'@'%' identified by '123456';
-
flush privileges;
-
连接数据库
conn = pymysql.connect(host="10.148.60.26",port=3306,user="Bill",passwd="123456",db="python")
输出如下结果表示成功:<pymysql.connections.Connection object at 0x000001FD35BEFBA8>
-
上述连接方法可以封装成一个函数:
def connect_mysql():
db_config = {
"host": "10.148.60.26",
"port": 3306,
"user": "Bill",
"passwd": "123456",
"db": "python",
"charset":"utf8"
}
conn = pymysql.connect(**db_config)
return conn
if __name__ == '__main__':
conn = connect_mysql()
print(conn)
游标cursor
- 游标(cursor)就是游动的标识,通俗的说,一条sql取出对应n条结果资源的接口/句柄,就是游标,沿着游标可以一次取出一行。引用网上的一张图来理解:
- 游标的使用
import pymysql
def conn_mysql():
data = {
"host":"192.168.80.130",
"port":3306,
"user":"python",
"passwd":"123456",
"db":"python"
}
conn = pymysql.connect(**data)
return conn
if __name__ == '__main__':
sql = "use python;show tables;"
conn = conn_mysql()
cur = conn.cursor() # 创建游标对象
try:
cur.execute(sql) # 执行一个数据库查询或命令
result = cur.fetchall() # 得到结果集中剩下所有的行
print(result)
cur.close() # 关闭游标对象
conn.commit() # 提交,不然无法保存新建或者修改的数据
except:
conn.rollback()
finally:
conn.close()
- fetchone() #得到结果集的下一样
- fetchemany(n) # 得到结果集的下n行
创建表
- 如果数据库连接存在我们可以使用execute()方法来为数据库创建表,如下所示创建表student:
#!/usr/bin/python3
import pymysql
def conn_mysql():
data = {
"host":"192.168.80.130",
"port":3306,
"user":"python",
"passwd":"123456",
"db":"python",
"charset":"utf8"
}
conn = pymysql.connect(**data)
return conn
if __name__ == "__main__":
conn = conn_mysql()
cursor = conn.cursor() # 创建游标
cursor.execute("DROP TABLE IF EXISTS student") # 使用 execute() 方法执行 SQL,如果表存在则删除
# 使用预处理语句创建表
sql = """CREATE TABLE STUDENT (
NAME CHAR(20) NOT NULL,
AGE INT,
GENDER ENUM('Male','Female'),
STUID INT )ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
AUTO_INCREMENT=1"""
try:
cursor.execute(sql)
conn.commit()
cursor.close()
except:
conn.rollback()
finally:
# 关闭数据库连接
conn.close()
数据库插入操作
- 使用执行 SQL INSERT 语句向表 STUDENT 插入记录
#!/usr/bin/python3
import pymysql
def conn_mysql():
data = {
"host":"192.168.80.130",
"port":3306,
"user":"python",
"passwd":"123456",
"db":"python"
}
conn = pymysql.connect(**data)
return conn
if __name__ == "__main__":
conn = conn_mysql()
cursor = conn.cursor() # 创建游标
cursor.execute("DROP TABLE IF EXISTS student") # 使用 execute() 方法执行 SQL,如果表存在则删除
# 使用预处理语句创建表
sql = """INSERT INTO STUDENT(
NAME,AGE,GENDER,STUID)
VALUES(
'BIll','18','Male','001')
"""
try:
cursor.execute(sql)
conn.commit()
cursor.close()
except:
conn.rollback()
finally:
# 关闭数据库连接
conn.close()
数据库的查询和删除
select * from Student where stdid = 10010 or age = 23 order by age desc limit 10;
从Student表中查找学生id为10010或年龄为23,以年龄降序,并且只列出10个数据select stdname from Student group by stdname;
学生表中有10000条数据,但这条命令以stdname分组后的结果少于10000条,因为有重名的学生 select stdname from Student group by stdname having count(stdname)>1;
列出了重名的学生select * from stdname where (select stdname from Student group by stdname having count(stdname)>1) order by age desc;
获得刚才的重名学生的信息,并以年龄反序排序
删除数据
delete from Student where stdi = 10010;