標籤:python mysql
1.遊標
遊標是系統為使用者開設的一個資料緩衝區,存放SQL語句的執行結果
使用者可以用SQL語句逐一從遊標中擷取記錄,並賦給主變數,交由python進一步處理,一組主變數一次只能存放一條記錄
僅使用主變數並不能完全滿足SQL語句嚮應用程式輸出資料的要求
遊標提供了一種對從表中檢索出的資料進行操作的靈活手段,就本質而言,遊標實際上是一種能從包括多條資料記錄的結果集中每次提取一條記錄的機制。遊標總是與一條SQL 選擇語句相關聯因為遊標由結果集(可以是零條、一條或由相關的選擇語句檢索出的多條記錄)和結果集中指向特定記錄的遊標位置群組成。當決定對結果集進行處理時,必須聲明一個指向該結果集的遊標。
常用方法:
cursor(): 建立遊標對象
close(): 關閉此遊標對象
fetchone(): 得到結果集的下一行
fetchmany([size = cursor.arraysize]): 得到結果集的下幾行
fetchall(): 得到結果集中剩下的所有行
excute(sql[, args]):執行一個資料庫查詢或命令
executemany (sql, args):執行多個資料庫查詢或命令
舉例:
import MySQLdbdef connect_mysql(): db_config = { ‘host‘: ‘192.168.48.128‘, ‘port‘: 3306, ‘user‘: ‘xiang‘, ‘passwd‘: ‘123456‘, ‘db‘: ‘python‘, ‘charset‘: ‘utf8‘ } cnx = MySQLdb.connect(**db_config) return cnx if __name__ == ‘__main__‘: cnx = connect_mysql() cus = cnx.cursor() sql = ‘‘‘select * from employees;‘‘‘ try: cus.execute(sql) result1 = cus.fetchone() print(‘result1:‘) print(result1) result2 = cus.fetchmany(1) print(‘result2:‘) print(result2) result3 = cus.fetchall() print(‘result3:‘) print(result3) cus.close() cnx.commit() except Exception as e: cnx.rollback() print(‘error‘) raise e finally: cnx.close()
結果:
result1:
(1001L, u‘li‘, u‘M‘, datetime.date(2015, 4, 1))
result2:
((1002L, u‘xian‘, u‘M‘, datetime.date(2015, 4, 1)),)
result3:
((1003L, u‘sheng‘, u‘M‘, datetime.date(2015, 4, 1)),)
解釋:
1,先通過 MySQLdb.connect(**db_config) 建立mysql連線物件
2,在通過 cus = cnx.cursor() 建立遊標
3,fetchone():在最終搜尋的資料中去一條資料
4,fetchmany(1) 在接下來的資料中在去1行的資料,這個數字可以自訂,定義多少就是在結果集中取多少條資料。
5,fetchall()是在所有的結果中搞出來所有的資料。
執行多條語句的sql時要注意,請閱讀一下代碼:
from demon2 import connect_mysqlimport MySQLdbdef connect_mysql(): db_config = { "host": "192.168.48.128", "port": 3306, "user": "xiang", "passwd": "123456", "db": "python", "charset": "utf8" }try: cnx = MySQLdb.connect(**db_config)except Exception as e: raise e return cnx if __name__ == "__main__": sql = "select * from tmp;" sql1 = "insert into tmp(id) value (%s);" param = [] for i in xrange(100, 130): param.append([str(i)]) print(param) cnx = connect_mysql() cus = cnx.cursor() print(dir(cus)) try: cus.execute(sql) cus.executemany(sql1, param) # help(cus.executemany) result1 = cus.fetchone() print("result1") print(result1) result2 = cus.fetchmany(3) print("result2") print(result2) result3 = cus.fetchall() print("result3") print(result3) cus.close() cnx.commit() except Exception as e: cnx.rollback() raise e finally: cnx.close()
2.資料庫連接池
python編程中可以使用MySQLdb進行資料庫的串連及諸如 查詢/插入/更新 等操作,但是每次串連mysql資料庫請求時,都是獨立的去請求訪問,相當浪費資源,而且訪問數量達到一定數量時,對mysql的效能會產生較大的影響。因此,實際使用中,通常會使用資料庫的串連池技術,來訪問資料庫達到資源複用的目的。
650) this.width=650;" src="https://s5.51cto.com/oss/201711/21/7ff1216482fecbf00a8ebb867a4790ca.png" title="x.png" alt="7ff1216482fecbf00a8ebb867a4790ca.png" />
python的資料庫連接池包 DBUtils:
DBUtils是一套Python資料庫連接池包,並允許對非安全執行緒的資料庫介面進行安全執行緒封裝。
DBUtils來自Webware for Python。
DBUtils提供兩種外部介面:
* PersistentDB :提供線程專用的資料庫連接,並自動管理串連。
* PooledDB :提供線程間可共用資料庫串連,並自動管理串連。
:
https://pypi.python.org/pypi/DBUtils/
下載解壓後,使用命令進行安裝
# python setup.py install
或者使用
# pip install DBUtils
舉例:
import MySQLdbfrom DBUtils.PooledDB import PooledDBdb_config = { "host": "192.168.48.128", "port": 3306, "user": "xiang", "passwd": "123456", "db": "python", "charset": "utf8"}pool = PooledDB(MySQLdb, 5, **db_config) # 5預設為串連池裡的最少串連數conn = pool.connection() # 以後每次需要資料庫連接就是用 connection() 函數擷取串連就好了cur = conn.cursor()SQL = "select * from tmp;"r = cur.execute(SQL)r = cur.fetchall()print(r)cur.close()conn.close()
PooledDB的參數:
1. mincached,最少的空閑串連數,如果空閑串連數小於這個數,pool會建立一個新的串連
2. maxcached,最大的空閑串連數,如果空閑串連數大於這個數,pool會關閉空閑串連
3. maxconnections,最大的串連數,
4. blocking,當串連數達到最大的串連數時,在請求串連的時候,如果這個值是True,請求串連的程式會一直等待,直到當前串連數小於最大串連數,如果這個值是False,會報錯,
5. maxshared 當串連數達到這個數,新請求的串連會分享已經分配出去的串連
總結:
在uwsgi中,每個http請求都會分發給一個進程,串連池中配置的串連數都是一個進程為單位的(即上面的最大串連數,都是在一個進程中的串連數),而如果業務中,一個http請求中需要的sql串連數不是很多的話(其實大多數都只需要建立一個串連),配置的串連數配置都不需要太大。
串連池對效能的提升表現在:
1.在程式建立串連的時候,可以從一個閒置串連中擷取,不需要重新初始化串連,提升擷取串連的速度
2.關閉串連的時候,把串連放回串連池,而不是真正的關閉,所以可以減少頻繁地開啟和關閉串連
3.設計表結構
在操作資料庫之前,先要設計資料庫表結構,通過分析經典的學生、課程、成績、老師幾者之間的關係,先來分析各個主體之間都有什麼屬性,並確定表結構;
在實際開發過程中,根據業務需要和業務屬性,設計不同的表結構;
以下是學生、課程、成績、老師幾者關係設計的表結構:
650) this.width=650;" src="https://s2.51cto.com/oss/201711/21/c9006236c5f5fd16f034d8d38ffcafca.png" title="1.png" alt="c9006236c5f5fd16f034d8d38ffcafca.png" />650) this.width=650;" src="https://s5.51cto.com/oss/201711/21/96352619f581ef2d2f85480f3440e635.png" title="2.png" alt="96352619f581ef2d2f85480f3440e635.png" />650) this.width=650;" src="https://s3.51cto.com/oss/201711/21/775940587cbc1e8eb0d83b7460e39e61.png" title="3.png" alt="775940587cbc1e8eb0d83b7460e39e61.png" />650) this.width=650;" src="https://s2.51cto.com/oss/201711/21/8ef451d94cc9a05f0eb406def58a141b.png" title="4.png" alt="8ef451d94cc9a05f0eb406def58a141b.png" />
本文出自 “筆記空間” 部落格,請務必保留此出處http://286577399.blog.51cto.com/10467610/1983939
27. Python對Mysql的操作(2)