SQLAlchemy

一.SQLAlchemy (至關於Django裏的model)

注:環境中沒有包先下載mysql

1.經過SQLAlchemy建立數據表

#1.導入SQLAlchemy
from sqlalchemy.ext.declarative import declarative_base

#2.建立orm模型基類
Base=declarative_base() #此處的base至關於Django中的建立表都要繼承的model

#3.導入orm對應數據庫數據類型的字段
from sqlalchemy import Column,Integer,String

#4.建立orm對象
class User(Base):
    __tablename__="user" #私有屬性,表明生成的表的名字叫user
    id=Column(Integer,primary_key=True,autoincrement=True) #表的一個列名叫id,數據類型爲int型,設置該列爲主鍵,自增
    name=Column(String(32),index=True) #表的一個列名叫name,數據類型是字符串,索引

#5.建立數據庫鏈接引擎
from sqlalchemy import create_engine
engine=create_engine("mysql+pymysql://root:@127.0.0.1:3306/day127?charset=utf8")

#6.去數據庫中建立User對象所對應的數據表
Base.metadata.create_all(engine) #去engine數據庫中建立全部繼承Base的orm對象

2.經過 SQLAlchemy對數據表進行增刪改查

(1)增長數據
# 1.想要操縱數據庫,先打開數據庫鏈接
from create_table import engine

# 2.建立會話
from sqlalchemy.orm import sessionmaker
Session=sessionmaker(engine) #建立會話窗口
db_session=Session() #打開會話窗口

# 3.增長數據
from create_table import User
user_obj=User(name="amy")

# 4.經過db_session(已經打開的會話窗口)提交數據
db_session.add(user_obj)

# 5.執行會話窗口中的全部操做
db_session.commit() #提交
db_session.close()
(2)增長批量數據

方式一sql

# 1.想要操縱數據庫,先打開數據庫鏈接
from create_table import engine

# 2.建立會話
from sqlalchemy.orm import sessionmaker
Session=sessionmaker(engine) #建立會話窗口
db_session=Session() #打開會話窗口

# 3.增長數據
from create_table import User
user1=User(name="ddd")
user2=User(name="eee")
user3=User(name="fff")

# 4.經過db_session(已經打開的會話窗口)提交數據
***********不一樣之處************
db_session.add(user1)
db_session.add(user2)
db_session.add(user3)
***********************

# 5.執行會話窗口中的全部操做
db_session.commit() #提交
db_session.close()

方式二數據庫

# 1.想要操縱數據庫,先打開數據庫鏈接
from create_table import engine

# 2.建立會話
from sqlalchemy.orm import sessionmaker
Session=sessionmaker(engine) #建立會話窗口
db_session=Session() #打開會話窗口

# 3.增長數據
from create_table import User

# 4.經過db_session(已經打開的會話窗口)提交數據
***********************
db_session.add_all([
    User(name="aaa"),
    User(name="bbb"),
    User(name="ccc")])
***********************

# 5.執行會話窗口中的全部操做
db_session.commit() #提交
db_session.close()
(3)查詢
# 0.建立會話並打開會話窗口
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
engine=create_engine("mysql+pymysql://root:@127.0.0.1:3306/day127?charset=utf8")
Session=sessionmaker(engine) #建立會話窗口
db_session=Session() #打開會話窗口

# 1.查詢全部
from create_table import User
user_list1=db_session.query(User) #獲得 SELECT user.id AS user_id, user.name AS user_name FROM user
user_list2=db_session.query(User).all() #獲得 [<create_table.User object at 0x0000017A0DF09208>, <create_table.User object at 0x0000017A0DF09278>, <create_table.User object at 0x0000017A0DF092E8>, <create_table.User object at 0x0000017A0DF09358>]
for row in user_list2:
    print(row.id,row.name)
'''
結果爲:
2 aaa
1 amy
3 bbb
4 ccc
'''

# 2.查詢第一個
user_obj=db_session.query(User).first()
print(user_obj.id,user_obj.name) #2 aaa(按照name排序)

# 3.帶條件的查詢
# 方式一
user_list3=db_session.query(User).filter(User.id==4).all()
print(user_list3[0].id,user_list3[0].name) #4 ccc

user_list5=db_session.query(User).filter(User.id <=4).all()
for row in user_list5:
    print(row.id,row.name)
# 方式二
user_list4=db_session.query(User).filter_by(id=4).first() #filter_by中寫SQL語句
print(user_list4.id,user_list4.name)

# 4.查看SQL語句
user_list6=db_session.query(User).filter_by(id=4)
print(user_list6)
'''
結果爲:
SELECT user.id AS user_id, user.name AS user_name 
FROM user 
WHERE user.id = %(id_1)s
'''
(4)更新修改
# 0.建立會話並打開會話窗口
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
engine=create_engine("mysql+pymysql://root:@127.0.0.1:3306/day127?charset=utf8")
Session=sessionmaker(engine) #建立會話窗口
db_session=Session() #打開會話窗口

# 1.修改單條數據
#SQL語句:update `user` set `name`=`ddd` where `name`=`ccc`
from create_table import User
res=user_list2=db_session.query(User).filter(User.name=="ccc").update({"name":"ddd"})
print(res) #返回值爲受影響的行數
db_session.commit()
db_session.close()

# 2.修改多條數據
from create_table import User
res=user_list2=db_session.query(User).filter(User.id>=3).update({"name":"ddd"})
print(res) #返回值爲受影響的行數
db_session.commit()
db_session.close()
(5)刪除
# 0.建立會話並打開會話窗口
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
engine=create_engine("mysql+pymysql://root:@127.0.0.1:3306/day127?charset=utf8")
Session=sessionmaker(engine) #建立會話窗口
db_session=Session() #打開會話窗口

#刪除數據
#SQL語句:delete from table where `name`=`ddd`
from create_table import User
res=user_list2=db_session.query(User).filter(User.name=="ddd").delete()
print(res) #返回受影響的行數
db_session.commit()
db_session.close()

3.ForeignKey(多表的增刪改查)

(1)建立含有外鍵的數據表
from sqlalchemy.ext.declarative import declarative_base
Base=declarative_base() #基類

from sqlalchemy import Column,Integer,String,ForeignKey
from sqlalchemy.orm import relationship

class Student(Base):
    __tablename__="student"
    id=Column(Integer,primary_key=True)
    name=Column(String(32))
    # **********school表中的id列*************
    school_id=Column(Integer,ForeignKey("school.id"))
    stu2sch=relationship("School",backref="stu2sch")
    # **********此處必定要注意表名的大小寫*************

class School(Base):
    __tablename__="school"
    id=Column(Integer,primary_key=True,autoincrement=True)
    name=Column(String(32))

from sqlalchemy import create_engine
engine=create_engine("mysql+pymysql://root:@127.0.0.1:3306/day127?charset=utf8")
Base.metadata.create_all(engine) #去engine數據庫中建立全部繼承Base的orm對象
(2)多表添加數據

方式一session

# 1.想要操縱數據庫,先打開數據庫鏈接
from create_table_foreign import engine

# 2.建立會話
from sqlalchemy.orm import sessionmaker
Session=sessionmaker(engine) #建立會話窗口
db_session=Session() #打開會話窗口

from create_table_foreign import School,Student

# 3.經過db_session(已經打開的會話窗口)添加數據
sch_obj=School(name="紅星小學1")
db_session.add(sch_obj)
sch=db_session.query(School).filter(School.name=="紅星小學").first()

stu_obj=Student(name="尚宏運1",school_id=sch.id)
db_session.add(stu_obj)
db_session.commit()
db_session.close()

方式二:添加數據relationship版lua

正向添加spa

# 1.想要操縱數據庫,先打開數據庫鏈接
from create_table_foreign import engine

# 2.建立會話
from sqlalchemy.orm import sessionmaker
Session=sessionmaker(engine) #建立會話窗口
db_session=Session() #打開會話窗口

from create_table_foreign import School,Student

# 3.經過db_session(已經打開的會話窗口)提交數據
stu_obj=Student(name="尚宏運4",stu2sch=School(name="紅星小學6"))
db_session.add(stu_obj)
db_session.commit()
db_session.close()

反向添加code

# 1.想要操縱數據庫,先打開數據庫鏈接
from create_table_foreign import engine

# 2.建立會話
from sqlalchemy.orm import sessionmaker
Session=sessionmaker(engine) #建立會話窗口
db_session=Session() #打開會話窗口

from create_table_foreign import School,Student

# 3.經過db_session(已經打開的會話窗口)提交數據
sch_obj=School(name="紅星小學2")
sch_obj.sch2stu=[Student(name="尚宏運2"),Student(name="尚宏運3")]
db_session.add(sch_obj)
db_session.commit()
db_session.close()
(3)多表查詢數據
# 1.想要操縱數據庫,先打開數據庫鏈接
from create_table_foreign import engine

# 2.建立會話
from sqlalchemy.orm import sessionmaker
Session=sessionmaker(engine) #建立會話窗口
db_session=Session() #打開會話窗口

# 3.查詢數據
from create_table_foreign import School,Student

#**************正向跨表查詢***************
stu_list=db_session.query(Student).all()
for row in stu_list:
    print(row.id,row.name,row.stu2sch.name)
    
#**************反向跨表查詢***************
sch_list=db_session.query(School).all()
for row in sch_list:
    for row2 in row.sch2stu:
        print(row.id,row.name,row2.name)
(4)多表數據更新
# 1.想要操縱數據庫,先打開數據庫鏈接
from create_table_foreign import engine

# 2.建立會話
from sqlalchemy.orm import sessionmaker
Session=sessionmaker(engine) #建立會話窗口
db_session=Session() #打開會話窗口

# 3.更新數據
from create_table_foreign import School,Student
sch=db_session.query(School).filter(School.name=="紅星小學1").first()
db_session.query(Student).filter(Student.name=="尚宏運3").update({"school_id":sch.id})
db_session.commit() #提交
db_session.close()
(5)多表數據刪除
# 1.想要操縱數據庫,先打開數據庫鏈接
from create_table_foreign import engine

# 2.建立會話
from sqlalchemy.orm import sessionmaker
Session=sessionmaker(engine) #建立會話窗口
db_session=Session() #打開會話窗口

# 3.刪除數據
from create_table_foreign import School,Student
sch_list=db_session.query(School).filter(School.name=="紅星小學2").all()
for row in sch_list:
    db_session.query(Student).filter(Student.school_id==row.id).delete()
db_session.commit() #提交
db_session.close()

4.關於查詢的更多操做

(1)and or
from sqlalchemy.sql import and_ , or_
ret = db_session.query(User).filter(and_(User.id ==1, User.name == 'amy')).all()
for row in ret:
    print(row.name)
    
ret = db_session.query(User).filter(or_(User.id ==1, User.name == 'aaa')).all()
for row in ret:
    print(row.name)
(2)指定查詢數據列 加入別名
r2 = db_session.query(User.name.label('username'), User.id).first()
print(r2.id,r2.username) 
(3)字符串匹配方式篩選條件
from sqlalchemy.sql import text
#查詢id小於value,name等於name的數據
r6 = db_session.query(User).filter(text("id<:value and name=:name")).params(value=224, name='DragonFire').order_by(User.id).all()
(4)原生SQL查詢
r7 = db_session.query(User).from_statement(text("SELECT * FROM User where name=:name")).params(name='DragonFire').all()
(5) 排序
user_list = db_session.query(User).order_by(User.id).all()
user_list = db_session.query(User).order_by(User.id.desc()).all()
for row in user_list:
    print(row.name,row.id)
(6)其餘查詢條件
ret = session.query(User).filter_by(name='DragonFire').all()
ret = session.query(User).filter(User.id > 1, User.name == 'DragonFire').all()

#between
ret = session.query(User).filter(User.id.between(1, 3), User.name == 'DragonFire').all() # between 大於1小於3的

#in
ret = session.query(User).filter(User.id.in_([1,3,4])).all() # in_([1,3,4]) 只查詢id等於1,3,4的
ret = session.query(User).filter(~User.id.in_([1,3,4])).all() # ~xxxx.in_([1,3,4]) 查詢不等於1,3,4的

#子查詢
ret = session.query(User).filter(User.id.in_(session.query(User.id).filter_by(name='DragonFire'))).all() 子查詢

# and_, or_
from sqlalchemy import and_, or_
ret = session.query(User).filter(and_(User.id > 3, User.name == 'DragonFire')).all()
ret = session.query(User).filter(or_(User.id < 2, User.name == 'DragonFire')).all()
ret = session.query(User).filter(
    or_(
        User.id < 2,
        and_(User.name == 'eric', User.id > 3),
        User.extra != ""
    )).all()
# select * from User where id<2 or (name="eric" and id>3) or extra != "" 

# 通配符
ret = db_session.query(User).filter(User.name.like('e%')).all()
ret = db_session.query(User).filter(~User.name.like('e%')).all()

# 限制
ret = db_session.query(User)[1:2]

# 排序
ret = db_session.query(User).order_by(User.name.desc()).all()
ret = db_session.query(User).order_by(User.name.desc(), User.id.asc()).all()

# 分組
from sqlalchemy.sql import func

ret = db_session.query(User).group_by(User.extra).all()
ret = db_session.query(
    func.max(User.id),
    func.sum(User.id),
    func.min(User.id)).group_by(User.name).all()

ret = db_session.query(
    func.max(User.id),
    func.sum(User.id),
    func.min(User.id)).group_by(User.name).having(func.min(User.id) >2).all()

#高級版更新操做
from my_create_table import User,engine
from sqlalchemy.orm import sessionmaker

Session = sessionmaker(engine)
db_session = Session()

#直接修改
db_session.query(User).filter(User.id > 0).update({"name" : "099"})

#在原有值基礎上添加 - 1
db_session.query(User).filter(User.id > 0).update({User.name: User.name + "099"}, synchronize_session=False)

#在原有值基礎上添加 - 2
db_session.query(User).filter(User.id > 0).update({"age": User.age + 1}, synchronize_session="evaluate")
db_session.commit()

5.多對多時的增刪改查

(1)建立含有多對多的數據表
from sqlalchemy.ext.declarative import declarative_base
Base=declarative_base()  #基類

from sqlalchemy import Column,Integer,String,ForeignKey
from sqlalchemy.orm import relationship

class Girls(Base):
    __tablename__="girl"
    id=Column(Integer,primary_key=True)
    name=Column(String(32))
    #建立關係
    girl2boy=relationship("Boys",secondary="Hotel",backref="boy2girl")

class Boys(Base):
    __tablename__="boy"
    id=Column(Integer,primary_key=True)
    name=Column(String(32))

#第三張表
class Hotel(Base):
    __tablename__="hotel"
    id=Column(Integer,primary_key=True)
    girl_id=Column(Integer,ForeignKey("girl.id"))
    boy_id=Column(Integer,ForeignKey("boy.id"))

#建立數據庫鏈接
from sqlalchemy import create_engine
engine=create_engine("mysql+pymysql://root:@127.0.0.1:3306/day127?charset=utf8")

#去數據庫中建立User對象所對應的數據表
Base.metadata.create_all(engine)
(2)添加
from sqlalchemy.orm import sessionmaker
from m2m import engine,Boys,Girls
Session=sessionmaker(engine)
db_session=Session()

###################經過boy添加girl(反向)#################
boy= Boys(name="李易峯")
boy.boy2girl= [Girls(name="趙麗穎"),Girls(name="李小璐")]
db_session.add(boy)
db_session.commit()
db_session.close()

#####################經過girl添加boy(正相)#########################
girl_obj=Girls(name="羅玉鳳",girl2boy=[Boys(name="小濤")])
db_session.add(girl_obj)
db_session.commit()
db_session.close()
(3)查詢
from sqlalchemy.orm import sessionmaker
from m2m import engine,Boys,Girls
Session=sessionmaker(engine)
db_session=Session()

#####################經過relationship正相#########################
b_list=db_session.query(Boys).all()
for boy in b_list:
    for girl in boy.boy2girl:
        print(boy.name,girl.name)

#####################經過relationship反向#########################
b_list=db_session.query(Boys).all()
for boy in b_list:
    for girl in boy.boy2girl:
        print(boy.name,girl.name)
相關文章
相關標籤/搜索