ORM 全稱 Object Relational Mapping, 翻譯過來叫對象關系映射。簡單的說,ORM 將數據庫中的表與面向對象語言中的類建立了一種對應關系。這樣,我們要操作數據庫,數據庫中的表或者表中的一條記錄就可以直接通過操作類或者類實例來完成。
SQLAlchemy 是Python 社區最知名的 ORM 工具之一,為高效和高性能的數據庫訪問設計,實現了完整的企業級持久模型。支持多數據庫,如mysql、Oracle等
安裝:
pip3 install sqlalchemy
使用步驟:
l
建立數據庫連接
l
描述表結構(如果表不存在則會新建表)
l
得到數據庫操作游標(會話session)
l
操作數據表,提供了兩種方法,分別為原生SQL語句操作(execute)和類方式操作
通過原生SQL語句操作
1 #導入必要模塊 2 from sqlalchemy import create_engine 3 4 #得到連接對象 5 #參數:mysql+pymysql://用戶名:密碼@地址/數據庫名 6 #添加參數 echo=True 表示打印日志到控制台 7 connal = create_engine("mysql+pymysql://root2:proot2@192.168.1.175/dongdb",encoding='utf-8') 8 9 #查詢 10 resselect=connal.execute("select * from tb_dong") 11 print(resselect.rowcount) #輸出查詢到的值 12 print(resselect.fetchall()) #輸出列表數據 13 14 #插入,輸出影響行數 15 resinsert=connal.execute("insert into tb_dong(namex,sex) values('%s','%s')"%("東小東xx","F")).rowcount 16 print(resinsert)
類方式操作
描述表結構時:
設置為主鍵【primary_key=True】、
是否可為空【nullable=False】、
外鍵【ForeignKey(“另一個表名.字段名”)】 #表名與字段名的點不可去掉
1 #導入必要模塊 2 import sqlalchemy 3 from sqlalchemy import create_engine 4 from sqlalchemy.ext.declarative import declarative_base 5 from sqlalchemy import Column, Integer, String 6 from sqlalchemy.orm import sessionmaker 7 8 9 #-------------得到連接對象-------------------- 10 #參數:mysql+pymysql://用戶名:密碼@地址/數據庫名 11 #添加參數 echo=True 表示打印日志到控制台 12 connal = create_engine("mysql+pymysql://root2:proot2@192.168.1.175/dongdb", 13 encoding='utf-8') 14 15 #----------------創建表,描述表結構----------------------- 16 #得到基類 17 classal = declarative_base() 18 class tb_dong3(classal): 19 __tablename__ = "tb_dong3" # 表名為 tb_dong3 20 id = Column(Integer, primary_key=True) # 設置列為主鍵,默認不可為空且自增 21 name = Column(String(15)) 22 password = Column(String(15)) 23 24 def __repr__(self): 25 return "<id=%s ; name=%s ; password=%s>"%(self.id,self.name,self.password) 26 27 #提交創建表命令 28 classal.metadata.create_all(connal) 29 30 #------------------ 游標獲取 ------------------ 31 32 #得到數據庫游標 33 cousession=sessionmaker(bind=connal)() 34 35 #--------------------插入數據------------------ 36 #設置要插入的數據 37 dataobj1=tb_dong3(name="dong",password="dongpp東1") 38 dataobj2=tb_dong3(name="dong",password="dongpp東2") 39 40 #添加數據,參數可為列表:add([dataobj1, dataobj1]) 41 cousession.add(dataobj1) 42 cousession.add(dataobj2) 43 44 #提交數據 45 cousession.commit() 46 47 #--------------------查詢數據--------------------- 48 #filter(tb_dong3.id>1)為條件查詢 49 #多條件查詢可以使用多個 filter 拼接 50 #查詢所有:all() 查詢一個:first() 計數:count() 51 resdata=cousession.query(tb_dong3).filter(tb_dong3.id>0).filter(tb_dong3.name=="dong").all() #查詢所有 52 print(resdata) #輸出全部查詢結果 53 #print(cousession.query(tb_dong3).filter(tb_dong3.id>0).filter(tb_dong3.name=="dong").count()) #查詢所有 54 print(len(resdata)) #得到查詢結果的數量,相當於上面一句 55 print(resdata[0].name) #取出name值 56 57 #----------------- 更新-------------------------- 58 #先查詢,然后賦值,然后提交 59 resupdate=cousession.query(tb_dong3).filter(tb_dong3.id==3).first() 60 resupdate.name="ddddddddd" 61 resupdate.password="xxxxxx" 62 cousession.commit() 63 64 #------------------- 刪除 ----------------------- 65 resdel=cousession.query(tb_dong3).filter(tb_dong3.id==73).first() 66 cousession.delete(resdel) 67 cousession.commit()
連表操作:
重點在於需要描述兩張表
1 #導入必要模塊 2 from sqlalchemy import create_engine 3 from sqlalchemy.ext.declarative import declarative_base 4 from sqlalchemy import Column, Integer, String 5 from sqlalchemy.orm import sessionmaker 6 7 8 #-------------得到連接對象-------------------- 9 #參數:mysql+pymysql://用戶名:密碼@地址/數據庫名 10 #添加參數 echo=True 表示打印日志到控制台 11 connal = create_engine("mysql+pymysql://root2:proot2@192.168.1.175/dongdb", 12 encoding='utf-8') 13 14 #----------------創建表,描述表結構----------------------- 15 #得到基類 16 classal = declarative_base() 17 #建立tb_dong3表描述 18 class tb_dong3(classal): 19 __tablename__ = "tb_dong3" # 表名為 tb_dong3 20 id = Column(Integer, primary_key=True) # 設置列為主鍵,默認不可為空且自增 21 name = Column(String(15)) 22 password = Column(String(15)) 23 24 def __repr__(self): 25 return "<id=%s ; name=%s ; password=%s>"%(self.id,self.name,self.password) 26 27 #建立tb_dong2表描述 28 class tb_dong2(classal): 29 __tablename__ = "tb_dong2" # 表名為 tb_dong3 30 id = Column(Integer, primary_key=True) # 設置列為主鍵,默認不可為空且自增 31 name = Column(String(10)) 32 sex = Column(String(1)) 33 34 def __repr__(self): 35 return "<id=%s ; name=%s ; sex=%s>"%(self.id,self.name,self.sex) 36 37 #提交創建表命令 38 classal.metadata.create_all(connal) 39 40 #------------------ 游標獲取 ------------------ 41 42 #得到數據庫游標 43 cousession=sessionmaker(bind=connal)() 44 45 #-------------------- 連表查詢 --------------------- 46 #tb_dong3.name==tb_dong2.name 兩表的name字段值相等 47 #得到單表數據(tb_dong2) 48 #resdata=cousession.query(tb_dong2).filter(tb_dong3.id>0).filter(tb_dong3.name==tb_dong2.name).all() 49 #輸出兩張表的數據(tb_dong2,tb_dong3) 50 resdata=cousession.query(tb_dong2,tb_dong3).filter(tb_dong3.id>0).filter(tb_dong3.name==tb_dong2.name).all() 51 print(resdata) #輸出全部查詢結果 52 print(len(resdata)) #得到查詢結果的數量,相當於上面一句 53 print(resdata[0][0].name) #取出name值