關係型數據庫存儲

關係型數據庫是基於關係模型的數據庫,而關係模型是經過二維表來保存的,因此它的存儲方式就是行列組成的表。多個表組成一個數據庫。python

關係型數據庫有多種,如MySQl、Oracle、SQLite、SQL Server等。mysql

MySQL的存儲

首先須要安裝MySQL數據庫和相關的庫web

相關數據庫的安裝

下載「mysql-installer-web-community-8.0.11.0.msi」,而後點擊Next直接安裝便可。sql

若是想要和Python交互的話,還須要安裝PyMySQL。數據庫

安裝完成後驗證是否安裝成功:fetch

>>> 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()

運行結果爲:spa

Database version: ('8.0.11',)


經過connect()方法聲明一個MySQL鏈接對象db,因爲MySQL在本地運行,因此傳入的是localhost;端口號是默認的。鏈接成功後,調用cursor()方法得到MySQL的操做遊標,利用遊標來執行兩句SQL語句,直接用execute()方法執行便可。第一句SQL語句用於得到數據庫的版本,調用fetchone()方法得到第一條數據,第二句SQL語句建立一個新的數據庫,默認編碼是utf8mb4。code

建立表

建立數據庫的操做只需執行一次就好,接下來新建立一個students數據表:orm

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()

運行結果: