SQLAlchemy的基础使用

Posted 中杯可乐不加冰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLAlchemy的基础使用相关的知识,希望对你有一定的参考价值。

一、ORM 与 SQLAlchemy 简介

ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射。简单的说,ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系。这样,我们要操作数据库,数据库中的表或者表中的一条记录就可以直接通过操作类或者类实例来完成。

SQLAlchemy 是Python 社区最知名的 ORM 工具之一,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型。

安装 SQLAlchemy:

pip3 install sqlalchemy

二、创建数据表和数据库连接

create_table.py

#导入
from sqlalchemy import Column,Integer, String, create_engine
from sqlalchemy.orm import sessionmaker    #创建操纵数据库的会话窗口
from sqlalchemy.ext.declarative import declarative_bas  

#创建对象的基类
Base = declarative_base()

# 定义User类:
class User(Base):
    # 表的名字:
    __tablename__ = user

    # 表的结构:
    id = Column(Integer, primary_key=True)
    name = Column(String(32),index=True)

#初始化数据库连接:
engine = create_engine("mysql+pymysql://root:口令@127.0.0.1:3306/数据库名?charset=utf8")

#创建会话对象
Session = sessionmaker(engine)#自动检索所有继承Base的ORM 对象 并且创建所有的数据表
Base.metadata.create_all(engine)

三、单表的增删改查操作

增加数据

技术图片
#mysql操作
insert into user(name) values ("fengchong")

#sqlalchemy操作
#1.导入数据库连接,表,会话对象
from create_table import engine,User,Session 

#2.打开会话对象
db_session = Session()

#3.添加一条数据 
db_session.add( User(name="fengchong") )
#执行会话窗口中的所有操作 
db_session.commit() 

#4.添加多条数据 
db_session.add_all(
  [ 
     User(name="zhaomingyang"),
     User(name="haha"),
     User(name="xiaoxiao") 
  ]
 ) 
db_session.commit()

#5.关闭会话对象
db_session.close()
crud_insert

查询数据

技术图片
#mysql操作:
select * from user where 条件

#sqlalchemy操作:
#1.导入
from create_table import User,engine,Session

#2.打开会话对象
db_session = Session()

#3.简单查询
user_list = db_session.query(User).all()
for user in user_list:
    print(user.id,user.name)
user = db_session.query(User).first()

#4.带条件的查询
user_list = db_session.query(User).filter(User.id == 3).all()   #取出符合条件的全部结果,结果为一个列表,里面存的是一个个的对象
print(user_list)

user = db_session.query(User).filter_by(id=4).first()
print(user)     #取出符合条件的第一个,user为符合条件的对象

user_list = db_session.query(User).filter(User.id >= 2).all()
print(user_list)
crud_query

修改数据

技术图片
mysql操作:
 UPDATE user SET name="fengchong123" WHERE name=fengchong

sqlalchemy操作:
#1.导入
from create_table import User,engine,Session

#2.打开会话对象
db_session = Session()

#3.先查询在修改
res = db_session.query(User).filter(User.name == "fengchong").update({"name":"fengchong123"})

#4.提交
db_session.commit()

#5.关闭会话
db_session.close()
crud_update

删除数据

技术图片
#mysql操作:
delete from user where id=5

#sqlalchemy操作:
#1.导入
from create_table import User,engine,Session

#2.打开会话对象
db_session = Session()

#3.先查询再删除
res = db_session.query(User).filter(User.id==5).delete()

#4.提交
db_session.commit()

#5.关闭会话
db_session.close()
crud_delete

高级版查询操作

技术图片
# 查询数据表操作
# and or
from sqlalchemy.sql import and_ , or_
ret = db_session.query(User).filter(and_(User.id == 3, User.name == fengchong)).all()    #and
print(ret)
ret = db_session.query(User).filter(or_(User.id == 4, User.name == fengchong123)).all()   #or
print(ret)
ret = db_session.query(User).filter_by(id=4,name="fengchong123").all()      #and
print(ret)

# 查询所有数据
r1 = db_session.query(User).all()

# 查询数据 指定查询数据列 加入别名
r2 = db_session.query(User.id.label("uid"),User.name.label("username")).first()
print(r2.uid,r2.username) 

# 表达式筛选条件
r3 = db_session.query(User).filter(User.name == "fengchong").all()

# 原生SQL筛选条件
r4 = db_session.query(User).filter_by(name=fengchong).all()
r5 = db_session.query(User).filter_by(name=fengchong).first()

# 字符串匹配方式筛选条件 并使用 order_by进行排序
from sqlalchemy.sql import text
r6 = db_session.query(User).filter(text("id=:value and name=:name")).params(value=3, name=fengchong).first()
print(r6.name)

# 原生SQL查询
r7 = db_session.query(User).from_statement(text("SELECT * FROM User where name=:name")).params(name=fengchong).all()

# 筛选查询列
# query的时候我们不在使用User ORM对象,而是使用User.name来对内容进行选取
user_list = db_session.query(User.name).all()
print(user_list)
for row in user_list:
    print(row.name)

# 别名映射  name as nick
user_list = db_session.query(User.name.label("nick")).all()
print(user_list)
for row in user_list:
    print(row.nick) # 这里要写别名了

# 筛选条件格式
user_list = db_session.query(User).filter(User.name == "fengchong").all()
user_list = db_session.query(User).filter(User.name == "fengchong").first()
user_list = db_session.query(User).filter_by(name="fengchong").first()
for row in user_list:
    print(row.nick)

# 复杂查询
from sqlalchemy.sql import text
user_list = db_session.query(User).filter(text("id<:value and name=:name")).params(value=3,name="fengchong")

# 查询语句
from sqlalchemy.sql import text
user_list = db_session.query(User).filter(text("select * from User id<:value and name=:name")).params(value=3,name="fengchong")

# 排序 :
user_list = db_session.query(User).order_by(User.id.asc()).all()
user_list = db_session.query(User).order_by(User.id.desc()).all()
for row in user_list:
    print(row.name,row.id)

# 其他查询条件
"""
ret = session.query(User).filter(User.id.between(1, 3), User.name == ‘fengchong‘).all() # between 大于1小于3的
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=‘fengchong‘))).all() 子查询

# 通配符
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(
    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()
"""
高级查询操作

高级版修改操作

技术图片
#直接修改
# 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)
db_session.commit()

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

四、一对多表的增删改查

创建数据表及关系relationship

技术图片
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 = Column(Integer,ForeignKey("school.id"))

    stu2sch = relationship("School",backref="sch2stu")     #backref用于反向查询

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

from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://root:口令@127.0.0.1:3306/数据库名?charset=utf8")

Base.metadata.create_all(engine)
create_table_ForeignKey.py

基于relationship增加数据

技术图片
from create_table_ForeignKey import engine,Student,School
#创建会话窗口
from sqlalchemy.orm import sessionmaker
#创建会话对象
Session = sessionmaker(engine)
#打开会话对象
db_session = Session()

##############1.正向添加数据#################
stu_obj = Student(name="baozi",stu2sch=School(name="北京大学"))
db_session.add(stu_obj)
db_session.commit()

##############2.反向添加数据第一种写法##################
sch_obj = School(name="天津大学")
sch_obj.sch2stu = [Student(name="xiena"),Student(name="hejiong")]
db_session.add(sch_obj)
db_session.commit()

##############2.反向添加数据第二种写法
sch_obj = School(name="清华大学",sch2stu = [Student(name="维嘉"),Student(name="吴昕")])
db_session.add(sch_obj)
db_session.commit()
curd_ForeignKey_insert.py

基于relationship查询数据

技术图片
#查询数据
from create_table_ForeignKey import engine,Student,School
#创建会话窗口
from sqlalchemy.orm import sessionmaker
#创建会话对象
Session = sessionmaker(engine)
#打开会话窗口
db_session = Session()

##############1.正向数据查询###############
stu_list = db_session.query(Student).all()
for row in stu_list:
    print(row.id,row.name,row.school_id,row.stu2sch.name)

##############2.反向数据查询################
sch_list = db_session.query(School).all()
for school in sch_list:
    for student in school.sch2stu:
        print(school.id,school.name,student.name)
curd_ForeignKey_select.py

更新数据

技术图片
from sqlalchemy.orm import sessionmaker
from create_table_ForeignKey import engine,Student,School

Session = sessionmaker(engine)
db_session = Session()

# 修改数据
sch = db_session.query(School).filter(School.name=="清华大学").first()
db_session.query(Student).filter(Student.name == "小笼包").update({"school_id":sch.id})
db_session.commit()
db_session.close()
curd_ForeignKey_update

删除数据

技术图片
from sqlalchemy.orm import sessionmaker
from create_table_ForeignKey import engine,Student,School

Session = sessionmaker(engine)
db_session = Session()

# 删除数据
sch = db_session.query(School).filter(School.name=="北京大学").first()
db_session.query(Student).filter(Student.school_id == sch.id).delete()
db_session.commit()
db_session.close()
curd_ForeignKey_delete.py

 

以上是关于SQLAlchemy的基础使用的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy 教程 —— 基础入门篇

sqlalchemy在pythonweb中开发的使用(基于tornado的基础上)

SQLAlchemy的基础使用

将 SQLAlchemy 声明式基础与 SQL 模型一起使用

[vscode]--HTML代码片段(基础版,reactvuejquery)

SQLAlchemy学习-1.环境准备与基础使用