基於sqlalchemy建表的orm查詢操作、單表查詢、多表查詢


一、orm查詢操作

1、給一個表 增加數據 

 

 2、表的 增,刪,改,查

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from models import Users
engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/python13", max_overflow=0, pool_size=5)
Connection
= sessionmaker(bind=engine) con = Connection() # 每次執行數據庫操作時,都需要創建一個Connection # 1 單增(add) # obj1 = Users(name="lsb1",age=12) # con.add(obj1) # con.commit() #必須提交才能生效 # con.close() #關閉鏈接 # 2 多個增加(add_all):可以對一個表添加多個數據或者對多個表添加多個數據 # con.add_all([ # Users(name="lsb1",age=12), # Users(name="esb",age=40), # Users(name="jsb",age=30), # Users(name="tsb",age=12), # #Host(name = "tsb",time=123213) # ]) # con.commit() #必須提交才能生效 # con.close() #關閉鏈接 # 3 刪除delete # con.query(Users).delete() # con.commit() #必須提交才能生效 # con.close() #關閉鏈接 # 4 改update # con.query(Users).update({"name":"sb","age":14})

# F查詢。如果基於原來的之上 加上一個字符串,要設置synchronize_session屬性為False # con.query(Users).update({Users.name:Users.name +" is true","age":1},synchronize_session=False)

# F查詢。如果基於原來的之上 加上一個數字,不用設置synchronize_session # con.query(Users).update({Users.age:Users.age + 10}) # con.commit() #必須提交才能生效 # con.close() #關閉鏈接 # 5查 (查是不需要commit,也能拿到結果,所有commit可寫可不寫) # r1 = con.query(Users).all() #查詢所有 # r1 = con.query(Users).first() #查單條記錄 # r1 = con.query(Users.age,Users.name.label("sb")).first() #查具體哪些字段 # r1 = con.query(Users).filter(Users.name == "tsb").first() # 過濾用filter(傳表達式) # r1 = con.query(Users).filter(Users.name == "tsb").update({"name": "sb", "age": 14}) # 指定一條記錄 改(先過濾再修改) r1 = con.query(Users).filter_by(name = "esb").first() # 過濾用filter_by(傳參數)
print(r1) 
con.commit()
#必須提交才能生效
con.close() #關閉鏈接

二、orm的單表查詢、

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from models import Users

engine = create_engine("mysql+pymysql://root:@127.0.0.1:3307/python13", max_overflow=0, pool_size=5)
Connection = sessionmaker(bind=engine)

session = Connection()   # 每次執行數據庫操作時,都需要創建一個Connection

# 一、單條件查詢(用參數)
# ret =  session.query(Users).filter_by(name = "esb").all()

# 二、多條件查詢(用表達式)
# ret  = session.query(Users).filter(Users.name == "sb",Users.age ==14 ).first()
# print(ret.age,ret.name)

# 三、區間查詢(用between):顧頭顧尾
# ret  = session.query(Users).filter(Users.age.between(30,40)).all()
# print(ret)

# 四、列表查詢(用 in_):相當於django中的__in
# ret =session.query(Users).filter(Users.id.in_([9,11,13])).all()
# print(ret)

# 五、非查詢(用 ~):取反查詢
# ret1 = session.query(Users).filter(~Users.id.in_([9,11,13])).all()
# print(ret1)


from sqlalchemy import or_,and_ # 六、或查詢(用 or_) 
# ret =  session.query(Users).filter(or_(Users.id == 9,Users.name=="jsb")).all()

# 七、與查詢(用 and_)
# ret =  session.query(Users).filter(and_(Users.id == 9,Users.name=="lsb1")).all()

# 八、or和and 整合查詢
# ret =  session.query(Users).filter(or_(
#     Users.id == 9,
#     and_(Users.name=="jsb",Users.id==13),
#
#     )
# ).all()

# 九、模糊查詢:like查詢 # 1、必須以b開頭
# ret = session.query(Users).filter(Users.name.like("b%")).all() # 2、第二字母是b
# ret = session.query(Users).filter(Users.name.like("_b%")).all() # 3、不以b開頭
# ret = session.query(Users).filter(~Users.name.like("b%")).all()

# 十、排序查詢(用order_by) # 1.desc 從大到小排序 (降序)
# ret = session.query(Users).filter(Users.id>1).order_by(Users.id.desc()).all() # 2.asc 從小到大排序 (升序)
# ret = session.query(Users).filter(Users.id>1).order_by(Users.id.asc()).all() # 3.多條件排序,先以年紀從大到小排,如果年齡相同,再以id從小到大排
# ret = session.query(Users).filter(Users.id>1).order_by(Users.age.desc(),Users.id.asc()).all()
# print(ret)

# 十一、分組查詢(用 group_by)
# ret  = session.query(Users).group_by(Users.name).all()

# 十二、聚合查詢 from sqlalchemy.sql import func # 再分組的時候如果要用聚合操作,就要導入func
# 1、選出組內最小年齡要大於等於30的組
# ret = session.query(Users).group_by(Users.name).having(func.min(Users.age)>=30).all() # 2、選出組內最小年齡要大於等於30的組,查詢組內的最小年齡,最大年紀,年紀之和, ret = session.query( func.min(Users.age), func.max(Users.age), func.sum(Users.age), Users.name ).group_by(Users.name).having(func.min(Users.age)>=30).all() print(ret)

 三、多表查詢

1、一對多

class Hobby(Base):
    __tablename__ = "hobby"
    id = Column(Integer,primary_key=True)
    catption =Column(String(50),default="雙色球")

class Person(Base):
    __tablename__ = "person"
    nid = Column(Integer,primary_key=True)
    name = Column(String(32))
    #hobby值tablename而不是Hobby類名,
    hobby_id = Column(Integer,ForeignKey("hobby.id"))

    # 更數據庫沒有關系,不會新增加字段,只能用於快速的鏈表查詢操作
    #relationship的第一個參數,是類名,第二個參數backref,用於反向查詢
    hobby =relationship("Hobby",backref="pres")
    def __repr__(self):
        return self.name

查詢

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from models import Hobby,Person

engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/python13", max_overflow=0, pool_size=5)
Connection = sessionmaker(bind=engine)

# 每次執行數據庫操作時,都需要創建一個Connection
session = Connection()

# 1 添加,沒有用關聯關系
# session.add_all([
#     Hobby(catption="淫詩"),
#     Hobby(catption="推背"),
#     Person(name="tank",hobby_id=1),
#     Person(name="jason",hobby_id=2)
# ])
# session.commit()
# session.close()
# 2 添加,用關聯關系 # 01、給Person表中的name字段添加一個數據,並關聯他的 愛好 # preson = Person(name="egon",hobby=Hobby(catption="相親")) # session.add(preson) # session.commit()
# session.close()
# 02、給Hobby表中catption字段添加一個數據,並關聯他的 主人 # hobb = Hobby(catption="人妖") # pres 是Person表中 字段hobby =relationship("Hobby",backref="pres") 用於反向查詢 # hobb.pres = [Person(name="owen"),Person(name="sean")] # session.add(hobb) # session.commit()
# session.close()
# 3 正向查詢 # pr = session.query(Person).filter( Person.name == "tank").first() # print(pr.name) # print(pr.hobby.catption) # 4 反向查 # v = session.query(Hobby).filter(Hobby.catption=="人妖").first() # print(v.catption) # print(v.pres) # 5 自己連表查詢(isouter=True表示是left join,不填默認為inner join) person_list1 = session.query(Person).join(Hobby,Person.hobby_id==Hobby.id).all() # inner join person_list = session.query(Hobby).join(Person,Person.hobby_id==Hobby.id,isouter=True) # left join print(person_list) session.close()

2、多對多

# 一個男孩可以喜歡多個女孩,一個女孩也可以喜歡多個男孩
class Boy2Girl(Base):
    __tablename__ = "boy2girl"
    id = Column(Integer, primary_key=True)
    girl_id = Column(Integer,ForeignKey("girl.id"))
    boy_id = Column(Integer,ForeignKey("boy.id"))


class Girl(Base):
    __tablename__ = "girl"
    id  = Column(Integer,primary_key=True)
    name =  Column(String(100),nullable=False)

    def __repr__(self):
        return self.name

class Boy(Base):
    __tablename__ = "boy"
    id = Column(Integer, primary_key=True)
    name = Column(String(100), nullable=False)
    #secondary=boy2girl 中間表的表名
   girl = relationship("Girl",secondary="boy2girl",backref = "boys") def __repr__(self):
        return self.name

查詢

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from models import Boy,Boy2Girl,Girl

engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/python13", max_overflow=0, pool_size=5)
Connection = sessionmaker(bind=engine)

session = Connection()  # 每次執行數據庫操作時,都需要創建一個Connection

#添加,沒有用關聯
# session.add_all([
#     Boy(name="tank"),
#     Boy(name="sean"),
#     Girl(name="倉老師"),
#     Girl(name="小澤老師")
# ])

# b2g = Boy2Girl(boy_id=1,girl_id=2)
# session.add(b2g )
# b2g = Boy2Girl(boy_id=2,girl_id=1)
# session.add(b2g )

# session.commit()
# session.close()

#添加,用關聯 # 01、給Boy表中的name字段 添加一個數據,並關聯他喜歡的 人
# boy = Boy(name="亞峰")
# boy.girl=[Girl(name="迪麗熱巴"),Girl(name="三上")]
# session.add(boy)
# session.commit()

# 01、給Girl表中的name字段 添加一個數據,並關聯她喜歡的 人
# girl = Girl(name="丹丹")
# girl.boys=[Boy(name="吳彥祖"),Boy(name="鹿晗")]
# session.add(girl)
# session.commit()


# 正向查:使用relationship的關系
# b = session.query(Boy).filter(Boy.name == "亞峰").first() # print(b.name) # print(b.girl)

# 反向查詢
g = session.query(Girl).filter(Girl.name=="丹丹").first()
print(g.name) print(g.boys)

四、數據庫管理

1、安裝:pip install flask-migrate

 

 

 

 

 

 

 

 

 

 

可以 進SQLAlchemy

。。。。。。

看 settings

 

 

 

 

切到項目目錄下 運行 初始化

 

 

 

 

 

 結果:多了個

 

 

 

 

 

 

 

 

怎么用:

先跑

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM