程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python操作mysql數據庫

編輯:Python

python操作數據庫的過程:

創建連接—獲取游標—執行命令—關閉游標—關閉連接

python訪問mysql 要用pymysql庫

pymysql需要安裝:pip install pymysql

安裝完之後導入pymysql,創建連接
連接數據庫的參數按照實際情況添加,端口號默認是3306,我的有沖突,改成了3307

# 導入pymysql
import pymysql
# 定義一個函數
# 這個函數用來創建連接(連接數據庫用)
def mysql_db():
# 連接數據庫肯定需要一些參數
conn = pymysql.connect(
host="127.0.0.1",
port=3307,
database="lebo",
charset="utf8",
user="root",
passwd="root"
)
if __name__ == '__main__':
mysql_db()

關於游標,執行SQL,查詢數據
游標需要創建游標還要關閉游標,為了防止忘關游標,所以用with

# 打開數據庫可能會有風險,所以添加異常捕捉
try:
with conn.cursor() as cursor:
# 准備SQL語句
sql = "select * from user"
# 執行SQL語句
cursor.execute(sql)
# 執行完SQL語句後的返回結果都是保存在cursor中
# 所以要從cursor中獲取全部數據
datas = cursor.fetchall()
print("獲取的數據:
", datas)
except Exception as e:
print("數據庫操作異常:
", e)
finally:
# 不管成功還是失敗,都要關閉數據庫連接
conn.close()

cursor中獲取數據的fetchall,fetchone,fetchmany

fetchall:獲取當前SQL語句能查出來的全部數據
fetchone:每次獲取一條數據。但是獲取到這條數據後,指針會往後移一行數據


fetchmany:直接告訴它想要多少條數據

插入一條數據
重點一個是commit,一個是rollback。有提交的地方一定要有回滾。回滾到上次提交的地方

 try:
with conn.cursor() as cursor:
# 准備SQL語句
value = "12,'魯肅'"
sql = f"insert into user values ({value});"
# 執行SQL語句
cursor.execute(sql)
# 執行完要提交
conn.commit()
print("提交成功")
except Exception as e:
# 如果執行失敗要回滾
conn.rollback()
print("數據庫操作異常:
", e)
finally:
# 不管成功還是失敗,都要關閉數據庫連接
conn.close()

添加多條數據

 try:
with conn.cursor() as cursor:
# 准備要插入的數據
# 插入一條
# value = "12,'魯肅'"
# 插入多條
value = "(13,'張三'),(14,'李四'),(15,'王五')"
# 准備SQL語句
sql = f"insert into user values {value};"
# 執行SQL語句
cursor.execute(sql)
# 執行完要提交
conn.commit()
print("提交成功")
except Exception as e:
# 如果執行失敗要回滾
conn.rollback()
print("數據庫操作異常:
", e)
finally:
# 不管成功還是失敗,都要關閉數據庫連接
conn.close()


表中可以看到已經插入成功

修改、更新數據
只需要修改添加的SQL語句,其他不變
增刪改查,除了查詢,其他都需要提交

 try:
with conn.cursor() as cursor:
# 准備SQL語句
sql = f"update user set name='封控了' where id = 1 ;"
# 執行SQL語句
cursor.execute(sql)
# 執行完要提交
conn.commit()
print("提交成功")
except Exception as e:
# 如果執行失敗要回滾
conn.rollback()
print("數據庫操作異常:
", e)
finally:
# 不管成功還是失敗,都要關閉數據庫連接
conn.close()


刪除數據

 try:
with conn.cursor() as cursor:
# 准備SQL語句
sql = "delete from user where id = 12;"
# 執行SQL語句
cursor.execute(sql)
# 執行完要提交
conn.commit()
print("刪除成功")
except Exception as e:
# 如果執行失敗要回滾
conn.rollback()
print("數據庫操作異常:
", e)
finally:
# 不管成功還是失敗,都要關閉數據庫連接
conn.close()

封裝一個需要自己寫SQL語句的mysql工具類

'''
封裝一個mysql工具類(需要自己寫SQL語句)
功能:mysql數據庫操作
步驟:
1.連接數據庫
2.通過連接對象,獲取游標對象
3.增刪改查操作
方法:
1.查
2.增刪改 commit,rollback
'''
# 先要導入pymysql
import pymysql
# 把連接參數定義成字典
config = {
"host": "127.0.0.1",
"port": 3307,
"database": "lebo",
"charset": "utf8",
"user": "root",
"passwd": "root"
}
class Mysqldb():
# 初始化方法
def __init__(self):
# 初始化方法中調用連接數據庫的方法
self.conn = self.get_conn()
# 調用獲取游標的方法
self.cursor = self.get_cursor()
# 連接數據庫的方法
def get_conn(self):
# **config代表不定長參數
conn = pymysql.connect(**config)
return conn
# 獲取游標
def get_cursor(self):
cursor = self.conn.cursor()
return cursor
# 查詢sql語句返回的所有數據
def select_all(self, sql):
self.cursor.execute(sql)
return self.cursor.fetchall()
# 查詢sql語句返回的一條數據
def select_one(self, sql):
self.cursor.execute(sql)
return self.cursor.fetchone()
# 查詢sql語句返回的幾條數據
def select_many(self, sql, num):
self.cursor.execute(sql)
return self.cursor.fetchmany(num)
# 增刪改除了SQL語句不一樣其他都是一樣的,都需要提交
def commit_data(self, sql):
try:
# 執行語句
self.cursor.execute(sql)
# 提交
self.conn.commit()
print("提交成功")
except Exception as e:
print("提交出錯
:", e)
# 如果出錯要回滾
self.conn.rollback()
# 當對象被銷毀時,游標要關閉,連接也要關閉
# 創建時是先創建連接後創建游標,關閉時是先關閉游標後關閉連接
def __del__(self):
self.cursor.close()
self.conn.close()

調用

# 已經封裝好mysql類了,就不用導入pymsql了,直接導入封裝好的類
from mysql_util import Mysqldb
# 實例化
my_db = Mysqldb()
# 寫查詢SQL語句
sql = "select * from user where id>5"
# 查詢所有
select_all = my_db.select_all(sql)
print("查詢所有數據:
", select_all)
# 查詢一條
select_one = my_db.select_one(sql)
print("查詢一條數據:
", select_one)
# 查詢多條
select_many = my_db.select_many(sql, 3)
print("查詢3條數據:
", select_many)
# 新增一條數據
value = (16, 'BBQ')
sql = f"insert into user values {value}"
insert_one = my_db.commit_data(sql)
# 新增多條數據
values = "(17, 'aaa'), (18, 'bbb'), (19, 'ccc')"
sql = f"insert into user values {values}"
insert_many = my_db.commit_data(sql)
# 修改數據
sql = "update user set name = '出不去了' where id = 17"
my_db.commit_data(sql)
# 刪除數據
sql = "delete from user where id = 17"
my_db.commit_data(sql)

封裝一個不用寫SQL語句,只需要填參數的工具類

只寫了基本的增刪改查,後面可以根據實際情況添加

import pymysql
class Database():
# **config是指連接數據庫時需要的參數,這樣只要參數傳入正確,連哪個數據庫都可以
# 初始化時就連接數據庫
def __init__(self, **config):
try:
# 連接數據庫的參數我不希望別人可以動,所以設置私有
self.__conn = pymysql.connect(**config)
self.__cursor = self.__conn.cursor()
except Exception as e:
print("數據庫連接失敗:
", e)
# 查詢一條數據
# 參數:表名table_name,條件factor_str,要查詢的字段field 默認是查詢所有字段*
def select_one(self, table_name, factor_str='', field="*"):
if factor_str == '':
sql = f"select {field} from {table_name}"
else:
sql = f"select {field} from {table_name} where {factor_str}"
self.__cursor.execute(sql)
return self.__cursor.fetchone()
# 查詢多條數據
# 參數:要查詢數據的條數num,表名table_name,條件factor_str,要查詢的字段field 默認是查詢所有字段*
def select_many(self, num, table_name, factor_str='', field="*"):
if factor_str == '':
sql = f"select {field} from {table_name}"
else:
sql = f"select {field} from {table_name} where {factor_str}"
self.__cursor.execute(sql)
return self.__cursor.fetchmany(num)
# 查詢全部數據
# 參數:表名table_name,條件factor_str,要查詢的字段field 默認是查詢所有字段*
def select_all(self, table_name, factor_str='', field="*"):
if factor_str == '':
sql = f"select {field} from {table_name}"
else:
sql = f"select {field} from {table_name} where {factor_str}"
self.__cursor.execute(sql)
return self.__cursor.fetchall()
# 新增數據
def insert(self,table_name, value):
sql = f"insert into {table_name} values {value}"
try:
self.__cursor.execute(sql)
self.__conn.commit()
print("插入成功")
except Exception as e:
print("插入失敗
", e)
self.__conn.rollback()
# 修改數據
# 參數:表名,set值(可能是一個,也可能是多個,所以用字典),條件
def update(self, table_name, val_obl,change_str):
sql = f"update {table_name} set"
# set後面應該是要修改的字段,但是可能會修改多個字段的值,所以遍歷一下
# key對應字段的名,val對應字段的值
for key, val in val_obl.items():
sql += f" {key} = {val},"
# 遍歷完的最後面會有一個逗號,所以給它切掉,然後再拼接條件
# !!!空格很重要
sql = sql[:-1]+" where "+change_str
try:
self.__cursor.execute(sql)
self.__conn.commit()
print("修改成功")
except Exception as e:
print("修改失敗
", e)
self.__conn.rollback()
# 刪除數據
def delete(self,table_name, item):
sql = f"delete from {table_name} where {item}"
try:
self.__cursor.execute(sql)
self.__conn.commit()
print("刪除成功")
except Exception as e:
print("刪除失敗
", e)
self.__conn.rollback()

引用 ↓

# 導包
from mysql_normal_util import Database
# 設置連接數據庫的參數
config = {
"host": "127.0.0.1",
"port": 3307,
"database": "lebo",
"charset": "utf8",
"user": "root",
"passwd": "root"
}
# 實例化時就直接傳參數
db = Database(**config)
# 查詢1條
select_one = db.select_one("user")
print(select_one)
# 查詢多條
select_many = db.select_many(3, "user")
print(select_many)
# 查詢所有數據(根據條件)
select_all = db.select_all("user", "id>10")
print(select_all)
# 新增一條數據
db.insert("user","(20,'111')")
# 新增多條數據
db.insert("user", "(21,'123'),(22,'456')")
# 修改一個字段的數據
db.update("user", {"name": "222"}, "id=20")
# 修改多個字段的數據
db.update("user", {"id": "23", "name": "12345"}, "id=103")
# 刪除數據
db.delete("user", "id=23")

先自我介紹一下,小編13年上師交大畢業,曾經在小公司待過,去過華為OPPO等大廠,18年進入阿裡,直到現在。深知大多數初中級java工程師,想要升技能,往往是需要自己摸索成長或是報班學習,但對於培訓機構動則近萬元的學費,著實壓力不小。自己不成體系的自學效率很低又漫長,而且容易碰到天花板技術停止不前。因此我收集了一份《java開發全套學習資料》送給大家,初衷也很簡單,就是希望幫助到想自學又不知道該從何學起的朋友,同時減輕大家的負擔。添加下方名片,即可獲取全套學習資料哦


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved