Python3操作MySQL資料庫(驅動:pymysql)
阿新 • • 發佈:2019-01-07
建庫建表
create database wuSir default character set utf8 collate utf8_general_ci;
use wuSir;
create table auth_info(
aid int not null auto_increment primary key,
auth_name varchar(32),
unique(auth_name)
)engine=innodb default charset=utf8;
create table user_info(
uid int not null auto_increment primary key,
name varchar(32),
passwd varchar(32),
sex ENUM("男","女")
)engine=innodb default charset=utf8;
create table user_auth(
id int,
auth_id int,
constraint auth_info foreign key(auth_id) references auth_info(aid),
constraint user_info foreign key(id) references user_info(uid)
)engine=innodb default charset=utf8;
insert into auth_info(auth_name) values("訂單管理"),("使用者管理"),("選單管理"),("許可權分配"),("Bug管理");
insert into user_info(name,passwd,sex) values("alex",123,"男"),("egon",123,"男");
insert into user_auth(id,auth_id) values(1,1),(2,1),(2 ,2),(2,3);
原生模組pymysql
一、安裝PyMySQL
Python是程式語言,MySQL是關係資料庫,它們是兩種不同的技術;要想使Python操作MySQL資料庫需要使用驅動。這裡選用pymysql驅動。
$ pip3 install pymysql //安裝
$ pip3 show pymysql //檢視是否安裝成功
二、建立MySQL表
執行下面的SQL語句,建立一張users 表。
CREATE TABLE `users` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`email` VARCHAR(255) COLLATE utf8_bin NOT NULL,
`password` VARCHAR(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
AUTO_INCREMENT=1 ;
三、Python操作MySQL
3.0 執行SQL
# 建立連線
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
# 建立遊標
cursor = conn.cursor()
# 執行SQL語句,並返回受影響行數
# 方式一:
effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
# 方式二:
sql = "select * from course where cid=1"
effect_row = cursor.execute(sql)
# 方式三:
sql = "select * from course where cid='%s'" %(1,)
effect_row = cursor.execute(sql)
# 方式四:普通 列表
sql = "select * from course where cid='%s'"
effect_row = cursor.execute(sql,1)
effect_row = cursor.execute(sql,[1])
# 方式五:字典格式
sql = "select * from course where cid='%(u)s'"
effect_row = cursor.execute(sql,{"u":1})
# 提交,不然無法儲存新建或者修改的資料
conn.commit()
# 獲取最新自增ID
new_id = cursor.lastrowid
# 獲取第一行資料
row_1 = cursor.fetchone()
# 獲取前n行資料
# row_2 = cursor.fetchmany(3)
# 獲取所有資料
# row_3 = cursor.fetchall()
注:在fetch資料時按照順序進行,可以使用cursor.scroll(num,mode)來移動遊標位置,如:
cursor.scroll(1,mode='relative') # 相對當前位置移動
cursor.scroll(2,mode='absolute') # 相對絕對位置移動
注:關於預設獲取的資料是元祖型別,如果想要或者字典型別的資料,即:
# 遊標設定為字典型別
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 關閉遊標
cursor.close()
# 關閉連線
conn.close()
3.1 插入資料:
import pymysql.cursors
# 連線MySQL資料庫
connection = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='198876', db='guest',
charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
# 通過cursor建立遊標
cursor = connection.cursor()
# 建立sql 語句,並執行
sql = "INSERT INTO `users` (`email`, `password`) VALUES ('[email protected]', '123456')"
cursor.execute(sql)
#插入一行
# sql = "insert into student_info(sname,gender,class_id) VALUES('alex1','女',2)"
#插入多行
sql = "insert into student_info(sname,gender,class_id) VALUES('alex1','女',2),('alex2','女',2),('alex3','女',2)"
r = cursor.execute(sql)
#或
sql = "insert into userinfo(username,password) values(%s,%s)"
# 受影響的行數
r = cursor.executemany(sql,[('egon','sb'),('laoyao','BS')])
# 提交SQL
connection.commit()
# 關閉遊標
cursor.close()
# 關閉連線
conn.close()
host為資料庫的主機IP地址
port為MySQL的預設埠號
user為資料的使用者名稱
password為資料庫的登入密碼
db為資料庫的名稱。
cursor()方法建立資料庫遊標。
execute()方法執行SQL語句。
commit()將資料庫的操作真正的提交到資料。
3.2 查詢資料:
import pymysql.cursors
# 連線MySQL資料庫
connection = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='198876', db='guest', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
# 通過cursor建立遊標
cursor = connection.cursor()
# 執行資料查詢
sql = "SELECT `id`, `password` FROM `users` WHERE `email`='[email protected]'"
cursor.execute(sql)
#查詢資料庫單條資料
result = cursor.fetchone()
print(result)
print("-----------華麗分割線------------")
# 執行資料查詢
sql = "SELECT `id`, `password` FROM `users`"
cursor.execute(sql)
#查詢資料庫多條資料
result = cursor.fetchall()
for data in result:
print(data)
# 關閉資料連線
connection.close()
執行結果:
{'password': '123456', 'id': 1}
-----------華麗分割線------------
{'password': '123456', 'id': 1}
{'password': '654321', 'id': 2}
fetchone() 用於查詢單條資料。
fetchall() 用於查詢多條資料。
close() 最後不要忘記了關閉資料連線。
ORM框架 SQLAchemy
不同資料庫連線方式
MySQL-Python
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
pymysql
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
MySQL-Connector
mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
cx_Oracle
oracle+cx_oracle://user:[email protected]:port/dbname[?key=value&key=value...]
更多詳見:http://docs.sqlalchemy.org/en/latest/dialects/index.html
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://root:[email protected]:3306/t1", max_overflow=5)
# 執行SQL
# cur = engine.execute(
# "INSERT INTO hosts (host, color_id) VALUES ('1.1.1.22', 3)"
# )
# 新插入行自增ID
# cur.lastrowid
# 執行SQL
# cur = engine.execute(
# "INSERT INTO hosts (host, color_id) VALUES(%s, %s)",[('1.1.1.22', 3),('1.1.1.221', 3),]
# )
# 執行SQL
# cur = engine.execute(
# "INSERT INTO hosts (host, color_id) VALUES (%(host)s, %(color_id)s)",
# host='1.1.1.99', color_id=3
# )
# 執行SQL
# cur = engine.execute('select * from hosts')
# 獲取第一行資料
# cur.fetchone()
# 獲取第n行資料
# cur.fetchmany(3)
# 獲取所有資料
# cur.fetchall()