1、面向對象應用場景:python
一、函數有共同參數,解決參數不斷重用;mysql
二、模板(約束同一類事物的,屬性和行爲)sql
三、函數編程和麪向對象區別:數據庫
面向對象:數據和邏輯組合在一塊兒;
函數編程:數據和邏輯不能組合在一塊兒,是分離的;django
2、ORM框架(對象、關係、映射):SQLALchemy編程
概念:SQLALchemy框架封裝了底層複雜的SQL語句,提供簡單的調用接口,讓Python程序調用,再把Python程
序寫的類,轉換成SQL語句發給MySQL執行;session
做業:架構
類---對應表
列---對應屬性
數據行----對應對象框架
每一張表是一個類函數
列名約束表數據,因此是屬性
每1行數據是,固定列實例化出來的對象;
3、ORM框架類型
一、DB frist:
先手動建立數據庫-----》ORM框架------》自動生成類
code frist :
二、不能建立數據庫,只能先手動建立數據庫和 類-----》ORM框架------》生成表 (SQL ALchemy屬於code
frist :)
django中ORM框架:既支持DB frist,也支持code frist。
3、SQLALchemy操做數據庫
1.SQLALchemy架構:
鏈接數據庫:不是SQLALchemy只作 類和SQL語句的轉換,鏈接數據庫是pymysql;
能夠在(engine=create_engine("mysql+pymysql)指定
一、建立/刪除表
1 from sqlalchemy.ext.declarative import declarative_base 2 from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index,CHAR,VARCHAR 3 from sqlalchemy.orm import sessionmaker, relationship 4 from sqlalchemy import create_engine 5 6 Base = declarative_base() 7 8 class UserType(Base): 9 __tablename__ = 'usertype' 10 id = Column(Integer, primary_key=True, autoincrement=True) 11 title = Column(VARCHAR(32), nullable=True, index=True) 12 13 class Users(Base): 14 __tablename__="User" #設置表的名字 15 id=Column(Integer,nullable=True,autoincrement=True,primary_key=True) 16 name=Column(String(32)) 17 email=Column(String(49)) 18 user_type_id = Column(Integer,ForeignKey("usertype.id")) # 設置外鍵 19 20 # __table_args__ ,SQLAlcheme的規則種設置索引 21 __table_args__ = ( 22 UniqueConstraint('id', 'name', name='uix_id_name'), 23 Index('ix_n_ex','name', 'email',), 24 ) 25 #鏈接指定數據庫 26 engine=create_engine("mysql+pymysql://eric:123123@192.168.182.128:3306/db666?charset=utf8", max_overflow=5) 27 # #找到程序中全部 類(表格),開始建立表; 28 # Base.metadata.create_all(engine) 29 # 30 # #刪除表 31 # Base.metadata.drop_all(engine)
一、增長數據
session.add() 增長1條
obj1=UserType(title="普通用戶") session.add(objs) #增長1條數據
session.add_all() 增長多條
objs=[ UserType(title="超級用戶"), UserType(title="白金用戶"), UserType(title="黑金用戶")] session.add_all(objs) #增長多條數據
更新數據:
先查找到數據再更新
1.批量更新
update({"title":"黑金"})
session.query(UserType).filter(UserType.id>2).update({"title":"黑金"})
2.在原基礎上(黑金) 修改值
synchronize_session=False
synchronize_session="evaluate"
參數說明:SQLALchemy根據最後傳入的synchronize_session參數,判斷更新數據的類型,是數字計算?仍是字符串拼接?
更新字符類型數據
session.query(UserType).filter(UserType.id>2).update({UserType.title:UserType.title+"VIP"},synchronize_session=False)
更新數字類型數據
session.query(Users).filter(Users.id > 2).update({"num": Users.num + 1}, synchronize_session="evaluate")
session.commit()
刪除數據
先查找到數據再刪除
res=session.query(Users).filter(Users.id==6).delete()
print(session.query(Users))SQLALchemy幫咱們生成的SQL查詢語句;
res=session.query(Users).all() #獲取查詢語句查詢到的全部行---->(對象組合) for row in res: print(row.id,row.name,row.email) #獲取行對象 的屬性(一行中有多少列)
res=session.query(Users).filter(Users.id>3) #filter按條件篩選查詢結果 for row in res: print(row.id,row.name,row.email) #獲取行對象 的屬性(一行中有多少列)
-----高級查詢
# 條件
ret = session.query(Users).filter_by(name='alex').all() 偉哥一問:filter_by()傳參數 filter()後面跟表達式
ret = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all()
ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all()
ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()
ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all()
ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()
from sqlalchemy import and_, or_
ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()
ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()
ret = session.query(Users).filter(
or_(
Users.id < 2,
and_(Users.name == 'eric', Users.id > 3),
Users.extra != ""
)).all()
# 通配符
ret = session.query(Users).filter(Users.name.like('e%')).all()
ret = session.query(Users).filter(~Users.name.like('e%')).all()
# 限制
ret = session.query(Users)[1:2]
# 排序
ret = session.query(Users).order_by(Users.name.desc()).all()
ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()
# 分組
from sqlalchemy.sql import func
ret = session.query(Users).group_by(Users.extra).all()
ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).all()
ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()
# 連表
ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()
ret = session.query(Person).join(Favor).all()
ret = session.query(Person).join(Favor, isouter=True).all()
# 組合
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union(q2).all()
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union_all(q2).all()
relationship 連表
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index,CHAR,VARCHAR
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
Base = declarative_base()
# 建立單表
"""
1 白金
2 黑金
obj.xx ==> [obj,obj...]
"""
class UserType(Base):
__tablename__ = 'usertype'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(VARCHAR(32), nullable=True, index=True)
"""
1 方少偉 1
2 成套 1
3 小白 2
# 正向
ut = relationship(backref='xx')
obj.ut ==> 1 白金
"""
class Users(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, autoincrement=True) name = Column(VARCHAR(32), nullable=True, index=True) email = Column(VARCHAR(16), unique=True) user_type_id = Column(Integer,ForeignKey("usertype.id")) user_type = relationship("UserType",backref='xxoo')