Python3連接MySQL
注意事項:cursor()方法用來創建一個光標對象,用來操作增刪改查,cursor.execute(sql,[a,b])。 參數寫成可迭代對象,例如:元組、列表。防止sql注入問題。
完事以后 conn用來conn.commit() 或者 conn.rollback()。
最后記得 cursor.close() , conn.close()。
-------------------------------------------------------------------------------------------------------
import pymysql conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) cursor = conn.cursor()
sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);"
sql = "UPDATE USER1 SET age=%s WHERE name=%s;"
data = [("Alex", 18), ("Egon", 20), ("Yuan", 21)] try: cursor.executemany(sql, data) // cursor.execute(sql, ["abc",28])
cursor.execute(sql, [4])
conn.commit() (只有增刪該之后才提交,查不用)
ret = cursor.fetchone()
ret = cursor.fetchall()
# 可以獲取指定數量的數據
cursor.fetchmany(3)
# 光標按絕對位置移動1 cursor.scroll(1, mode="absolute") # 光標按照相對位置(當前位置)移動1 cursor.scroll(1, mode="relative")
# 提交之后,獲取剛插入的數據的ID
last_id = cursor.lastrowid
except Exception as e:
conn.rollback()
cursor.close()
conn.close()
-----------------------------------------------------------------------------------------------------------------------------------------
數據庫連接池的作用:
數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是再重新建立一個;釋放空閑時間超過最大空閑時間的數據庫連接來避免因為沒有釋放數據庫連接而引起的數據庫連接遺漏。這項技術能明顯提高對數據庫操作的性能。
Python 創建、使用mysql連接池
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2017/11/22 20:35 # @Author : lijunjiang # @File : demo1.py import MySQLdb from DBUtils.PooledDB import PooledDB # 導入方法 # 數據庫連接信息 connect_mysql = { 'host':'11.11.11.11', 'port':3306, 'charset':'utf8', 'db':'netcutecontent', 'user':'python', 'passwd':'python' } # 創建連接池 PooledDB() 方法 pool = PooledDB(MySQLdb, 5, **connect_mysql) if __name__ == '__main__': cnx = pool.connection() # 創建連接池連接 connection() 方法 cus = cnx.cursor() # 創建游標對象 cursor() 方法 SQL = 'select * from servernode' # 定義sql語句 try: cus.execute(SQL) # 執行sql語句 execute() 方法 result = cus.fetchall() # 獲取執行結果 fetchall() 方法(獲取所有結果) 返回列表 for result_one in result: #打印結果 print(result_one) # print(result) cus.close() # 關閉游標對象 except Exception as err: raise err finally: cnx.close() # 關閉 數據庫連接 close() 方法
-----------------------------------------------------------------------------------------------------------------------------------------
本文介紹Python3連接MySQL的第三方庫--PyMySQL的基本使用。
PyMySQL介紹
PyMySQL 是在 Python3.x 版本中用於連接 MySQL 服務器的一個庫,Python2中則使用mysqldb。
Django中也可以使用PyMySQL連接MySQL數據庫。
PyMySQL安裝
pip install pymysql
連接數據庫
注意事項
在進行本文以下內容之前需要注意:
- 你有一個MySQL數據庫,並且已經啟動。
- 你有可以連接該數據庫的用戶名和密碼
- 你有一個有權限操作的database
基本使用
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() # 定義要執行的SQL語句 sql = """ CREATE TABLE USER1 ( id INT auto_increment PRIMARY KEY , name CHAR(10) NOT NULL UNIQUE, age TINYINT NOT NULL )ENGINE=innodb DEFAULT CHARSET=utf8; """ # 執行SQL語句 cursor.execute(sql) # 關閉光標對象 cursor.close() # 關閉數據庫連接 conn.close()
增刪改查操作
增
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" username = "Alex" age = 18 # 執行SQL語句 cursor.execute(sql, [username, age]) # 提交事務 conn.commit() cursor.close() conn.close()
插入數據失敗回滾
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" username = "Alex" age = 18 try: # 執行SQL語句 cursor.execute(sql, [username, age]) # 提交事務 conn.commit() except Exception as e: # 有異常,回滾事務 conn.rollback() cursor.close() conn.close()
獲取插入數據的ID(關聯操作時會用到)
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" username = "Alex" age = 18 try: # 執行SQL語句 cursor.execute(sql, [username, age]) # 提交事務 conn.commit() # 提交之后,獲取剛插入的數據的ID last_id = cursor.lastrowid except Exception as e: # 有異常,回滾事務 conn.rollback() cursor.close() conn.close()
批量執行
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" data = [("Alex", 18), ("Egon", 20), ("Yuan", 21)] try: # 批量執行多條插入SQL語句 cursor.executemany(sql, data) # 提交事務 conn.commit() except Exception as e: # 有異常,回滾事務 conn.rollback() cursor.close() conn.close()
刪
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() sql = "DELETE FROM USER1 WHERE id=%s;" try: cursor.execute(sql, [4]) # 提交事務 conn.commit() except Exception as e: # 有異常,回滾事務 conn.rollback() cursor.close() conn.close()
改
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() # 修改數據的SQL語句 sql = "UPDATE USER1 SET age=%s WHERE name=%s;" username = "Alex" age = 80 try: # 執行SQL語句 cursor.execute(sql, [age, username]) # 提交事務 conn.commit() except Exception as e: # 有異常,回滾事務 conn.rollback() cursor.close() conn.close()
查
查詢單條數據
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() # 查詢數據的SQL語句 sql = "SELECT id,name,age from USER1 WHERE id=1;" # 執行SQL語句 cursor.execute(sql) # 獲取單條查詢數據 ret = cursor.fetchone() cursor.close() conn.close() # 打印下查詢結果 print(ret)
查詢多條數據
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() # 查詢數據的SQL語句 sql = "SELECT id,name,age from USER1;" # 執行SQL語句 cursor.execute(sql) # 獲取多條查詢數據 ret = cursor.fetchall() cursor.close() conn.close() # 打印下查詢結果 print(ret)
進階用法
# 可以獲取指定數量的數據 cursor.fetctmany(3) # 光標按絕對位置移動1 cursor.scroll(1, mode="absolute") # 光標按照相對位置(當前位置)移動1 cursor.scroll(1, mode="relative")