1. 程式人生 > >Python3操作MySQL資料庫(驅動:pymysql)

Python3操作MySQL資料庫(驅動:pymysql)

建庫建表

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