python第16次課

關於mysql中的事務、python訪問mysql簡單步驟、mysql常見操做等內容點擊python訪問mysql查看。
在前面介紹python訪問mysql的一個典型執行過程當中出現了cursor()方法,它就是遊標。咱們執行sql命令或者獲得執行結果都須要使用遊標。python

curosr()

cursor遊標是處理數據的一種方法,爲了查看或者處理結果集中的數據,遊標提供了在結果集中一次一行或者多行前進或向後瀏覽數據的能力。能夠將遊標當作一個指針,它能夠指定結果中的任何位置,而後容許用戶對指定位置的數據進行處理。

創建數據庫鏈接以後,使用cursor提供的方法執行命令或者返回結果。mysql

執行命令

  • execute(self, query, args=None)
    執行一個數據庫sql命令。
  • executemany(self, query, args)
    執行多個數據庫sql命令。
  • callproc(self, procname, args=())
    執行存儲過程。

上述方法返回結果爲受影響的行數。sql

返回結果

  • fetchall(self)
    接受所有的返回結果行。
  • fetchmany(self, size=None)
    接受size條返回結果行。若是size值大於結果行的數量則返回cursor.arraysize條數據。
  • fetchone(self)
    返回結果行的下一行。

上述方法返回結果爲元組tuple
示例數據庫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import pymysql

def conn_mysql():
    db_config={
        'host': '127.0.0.1',
        'port': 3306,
        'user': 'root',
        'password': '123456',
        'db': 'mysql'
    }
    conn = pymysql.connect(**db_config)
    return conn

cnm = conn_mysql()
cus = cnm.cursor()
sql = 'select host,user from user'
try:
    cus.execute(sql)
    print(cus.fetchmany(size=1))    #輸出結果:(('localhost', 'mysql.session'),)
    print(cus.fetchall())    #輸出結果:(('localhost', 'mysql.sys'), ('localhost', 'root'))
    print(cus.fetchone())    #輸出結果:None
    cus.close()    #關閉遊標對象
    cnm.commit()    #正確則提交
except Exception as e:
    cnm.rollback()    #錯誤則回滾
    print("錯誤")
finally:
    cnm.close()    #數據庫鏈接須要關閉

 

說明:
執行該sql最後結果爲3條,fetchall()fetchmany()fetchone()出現位置不一樣,則結果不一樣。
fetchmany(size=1) 取出結果集中的第一條。此時遊標處於第二行開始位置。
fetchall() 取出結果集中的所有,也就是遊標當前位置至結束,此時遊標處於結果集末尾。
fetchone() 取出結果集中的下一條,此時遊標處於末尾,返回None。
executemany說明
executemany()主要是針對一條sql須要執行屢次,每次執行的參數不一樣狀況。數據量較多時建議使用executemany()方法,速度較快。
下面是executemany()簡單示例。編程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pymysql

conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='test')
cus = conn.cursor()
sql = 'insert into test(id, name) values(%s, %s)'
args = [(1, 'Alice'), (2, 'Bob'), (3, 'Cellary')]
try:
    print(cus.executemany(sql, args))    #輸出結果:3
except Exception as e:
    print("執行出錯:{0}".format(e))
finally:
    cus.close()
    conn.commit()
    conn.close()

 

數據庫鏈接池

python編程中使用pymysql進行數據庫的鏈接及諸如查詢/插入/更新等操做,可是每次鏈接mysql數據庫請求時都是獨立的額請求,比較浪費資源,並且訪問數量達到必定數量時,對mysql性能會產生較大的影響。所以在實際使用過程當中一般會使用數據庫的鏈接池技術來訪問數據庫,從而實現資源複用。同時也能夠保證數據庫不會由於鏈接數過多而形成數據庫宕機。
在python中DBUtils是一套數據庫鏈接池包,提供2種接口。session

  • PersistentDB :提供線程專用的數據庫鏈接,並自動管理鏈接。
  • PooledDB :提供線程間可共享的數據庫鏈接,並自動管理鏈接。

下面使用PooledDB示例ide

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import pymysql
from DBUtils.PooledDB import PooledDB

from DBUtils.PooledDB import PooledDB
db_config = {
        "host": "127.0.0.1",
        "port": 3306,
        "user": "root",
        "passwd": "123456",
        "db": "test",
        # "charset": "utf8"
    }

spool = PooledDB(pymysql, 5, **db_config)  # 5爲鏈接池裏的最少鏈接數
conn = spool.connection()  # 之後每次須要數據庫鏈接就是用connection()函數獲取鏈接
cur = conn.cursor()
SQL = "select * from test;"
r = cur.execute(SQL)
r = cur.fetchall()
print(r)
cur.close()
conn.close()

 

數據庫操做

常見的mysql操做溫習函數

1
2
3
4
5
6
7
8
查看全部的庫  show databases;
切換數據庫  use test
查看庫中全部的表  show tables;
查看數據庫鏈接數  show processlist
受權超級用戶  grant all privileges on *.* to 'user'@'%' identified by 'password' with grant option;
查詢建表語句 show create table student\G
查詢表結構 desc student;
查看index  show index from student;

 

\G可使結果顯示更容易查看。
數據庫操做其實就是SQL語句,介紹經常使用的增刪改查語句。性能

  • 建表create
    1
    2
    3
    4
    5
    6
    7
    create table student(
        StdID int not null,
        StdName varchar(100),
        Gender enum('M','F'),
        Age int,
        Score int
    )

mysql中經常使用數據類型爲int(整型)和varchar(字符型),當字段取值爲固定值時,能夠採用枚舉類型enum
char和varchar區別在於存儲數據時,當數據大小小於聲明的大小時,varchar按照實際數據大小存放,char則會添加空格至聲明的數據大小。
varchar(5)存儲123,實際存儲爲123
char(5)存儲123,實際存儲爲123(後面帶2空格)。學習

  • 插入insert
    1
    2
    3
    insert into student(StdID,StdName,Gender,Age,Score)values(01,'xiaohh','M',18,99);
    insert into student(StdID,StdName,Score,Age)values(02,'Bob',59,18);
    insert into student(StdID,StdName,Score)values(03,'Alice',68),(04,'Lisa',88);

最後一條語句爲插入多行的寫法。

  • 更新update

    1
    update student set Score=100 where StdID=01 and Score=99;
  • 查詢select

    1
    2
    3
    select * from student;
    select StdID,Score from student;
    select * from student where Score > 59 and Gender='M';
  • 刪除delete

    1
    2
    3
    delete from student where Score < 60;
    truncate table student;
    drop table student;

truncate:清空表中的數據,和不帶where條件的delete做用同樣。
drop:刪除表結構。

  • 建立索引index

    1
    2
    create index idx_std_stID on student(StdID);
    alter table student add index idx_std_stScore(StdID,Score);
  • 刪除索引index

    1
    alter table student drop index idx_std_stScore;

經過常見索引能夠加快語句查詢的速度,相似於字典中的目錄。
那麼咱們如何肯定語句是否使用索引呢?使用explain+sql語句便可。
explain select StdID from student;
mysql_explain_StdIDmysql_explain_StdID
explain select Score from student;
mysql_explain_Scoremysql_explain_Score
explain select Age from student;
mysql_explain_Agemysql_explain_Age
從字段key中能夠看到索引名稱,若爲null則表示未使用索引。
備註
對於sql語句及index索引只是介紹基本的語法規則,更多內容之後繼續學習。
查詢中可能涉及到多表的join,可能會用到分組group by,也可能會使用到更多的count()order by等函數。
索引可能會涉及到惟一索引UNIQUE INDEX、全文索引FULLTEXT INDEX等內容。

相關文章
相關標籤/搜索