ORM框架之SQLALchemy

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()

 

 

查詢數據:

一、.all()獲取所有行對象

print(session.query(Users))SQLALchemy幫咱們生成的SQL查詢語句;
res=session.query(Users).all() #獲取查詢語句查詢到的全部行---->(對象組合)
for row in res:
    print(row.id,row.name,row.email)  #獲取行對象 的屬性(一行中有多少列)

一、.filter()條件篩選查詢到的對象

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')

相關文章
相關標籤/搜索