关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以它的存储方式就是行列组成的表。多个表组成一个数据库。
关系型数据库有多种,如MySQl、Oracle、SQLite、SQL Server等。
MySQL的存储
首先需要安装MySQL数据库和相关的库
相关数据库的安装
下载“mysql-installer-web-community-8.0.11.0.msi”,然后点击Next直接安装即可。
如果想要和Python交互的话,还需要安装PyMySQL。
安装完成后验证是否安装成功:
>>> import pymysql
>>> pymysql.VERSION
(0, 9, 2, None)
连接数据库
利用PyMySQL连接MySQL,然后创建一个新的数据库,名字叫作chenzf。
import pymysql
db = pymysql.connect(host='localhost', user='root', password='1xxxxx8', port=3306)
cursor = db.cursor()
cursor.execute('SELECT VERSION()')
data = cursor.fetchone()
print('Database version:', data)
cursor.execute("CREATE DATABASE chenzf DEFAULT CHARACTER SET utf8mb4")
db.close()
运行结果为:
Database version: ('8.0.11',)
通过connect()方法声明一个MySQL连接对象db,由于MySQL在本地运行,所以传入的是localhost;端口号是默认的。连接成功后,调用cursor()方法获得MySQL的操作游标,利用游标来执行两句SQL语句,直接用execute()方法执行即可。第一句SQL语句用于获得数据库的版本,调用fetchone()方法获得第一条数据,第二句SQL语句创建一个新的数据库,默认编码是utf8mb4。
创建表
创建数据库的操作只需执行一次就好,接下来新创建一个students数据表:
import pymysql
db = pymysql.connect(host='localhost', user='root', password='xxxxxx', port=3306, db='chenzf')
cursor = db.cursor()
sql = """CREATE TABLE IF NOT EXISTS students (
id VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL,
age INT NOT NULL,
PRIMARY KEY (id))"""
cursor.execute(sql)
db.close()
运行结果:
插入数据
向数据库中插入信息:
import pymysql
new_id = '20180001'
new_user = 'chen'
new_age = 25
db = pymysql.connect(host='localhost', user='root', password='xxxxx', port=3306, db='chenzf')
cursor = db.cursor()
sql = 'INSERT INTO students(id, name, age) values(%s, %s, %s)'
try:
cursor.execute(sql, (new_id, new_user, new_age))
db.commit()
except:
db.rollback()
db.close()
需要执行db对象的commit()方法才可以实现数据插入,这个方法才是真正将语句提交到数据库执行的方法。对于数据插入、更新、删除操作,都需调用该方法才能生效。
加入异常处理,如果执行失败,则调用rollback()执行数据回滚。
这里涉及到事务问题:事务机制可以确保数据的一致性,也就是这件事要么发生了,要么没有发生。插入、删除、更新操作都必须是一个事务,所以这些操作的标准写法是:
try:
cursor.execute(sql)
db.commit()
except:
db.rollback()
运行结果:
为了方便插入数据,需要构造一个通用方法:传入动态变化的字典!
import pymysql
data = {
'id': '20180002',
'name': 'BOB',
'age': 25
}
table = 'students' # 表名
keys = ', '.join(data.keys()) # 用逗号隔开
values = ', '.join(['%s'] * len(data)) # 构造%s, %s, %s
# sql = 'INSERT INTO students(id, name, age) values(%s, %s, %s)'
sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)
db = pymysql.connect(host='localhost', user='root', password='120618', port=3306, db='chenzf')
cursor = db.cursor()
try:
# cursor.execute(sql, (new_id, new_user, new_age))
cursor.execute(sql, tuple(data.values()))
print('Successful')
db.commit()
except:
print('Failed')
db.rollback()
db.close()
运行结果: