首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SALalchemy增删改查

SALalchemy增删改查

原创
作者头像
少年包青菜
修改于 2020-05-13 07:16:01
修改于 2020-05-13 07:16:01
1.1K00
代码可运行
举报
文章被收录于专栏:Python 学习Python 学习
运行总次数:0
代码可运行

1.单表操作

1.1创建表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, INT, String
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# Base 是 ORM的基类
Base = declarative_base()


# 1.创建表
class User(Base):
    # 表名,最好设定和类名一样
    __tablename__ = 'user'
    # id int类型,主键,自增长
    id = Column(INT, primary_key=True, autoincrement=True)
    name = Column(String(32), index=True)
    age = Column(INT)
    gender = Column(String(100))


# 2.创建数据引擎
engine = create_engine('mysql+pymysql://root:123@192.168.1.163:3306'
                       '/my_test?charset=utf8')

# 3.将继承 Base 的类全部转化成表
Base.metadata.create_all(engine)


# 添加字段
def add_column(my_engine, table_name, column):
    """
    :param my_engine: engine 导入的引擎
    :param table_name: 表名 __tablename__
    :param column: # 列名
    :return:
    """
    # 获取列名
    column_name = column.compile(dialect=engine.dialect)
    # 获取属性
    column_type = column.type.compile(engine.dialect)
    print(column_name, column_type)
    # my_engine.execute('ALTER TABLE {} ADD COLUMN {} {}'.format(table_name, column_name, column_type))


add_column(engine, 'user', User.gender)

1.2 增、删、改、查

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from 单表操作.create_table import User

# 1.有一个创建连接的引擎
engine = create_engine(
    'mysql+pymysql://root:123@192.168.1.163:3306/my_test?charset=utf8'
)

# 2.有一个会话窗口
Session_window = sessionmaker(engine)

# 3.建立会话
db_session = Session_window()

1.2.1 增

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 新增一条数据
# db_session.add(User(name='bob', age=22))

# 插入多条数据
db_session.add_all([
    User(name='hello', age=12),
    User(name='shit', age=18),
])

1.2.2 删

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 删除数据,可以多个条件
db_session.query(User).filter(User.id >= 3, User.age >= 15).delete()
db_session.commit()

1.2.3 改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db_session.query(User).filter(User.id >= 2).update({'age': 50})
db_session.commit()

1.2.4 查

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 1.查询单条数据,查询出来是一个列表
# user_obj_list = db_session.query(User).all()
# for user_obj in user_obj_list:
#     print(user_obj.name, user_obj.age)

# 2.带条件的查询
# user_obj = db_session.query(User).filter(User.name == 'leon').first()  # type:User
# print(user_obj.name, user_obj.age)

user_obj_list = db_session.query(User).filter(User.id >= 2, User.age <= 20)
for user_obj in user_obj_list:
    print(user_obj.name, user_obj.age)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db_session.commit()
db_session.close()

2.外键一对多

2.1创建表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, INT, VARCHAR, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy import create_engine

Base = declarative_base()


class Student(Base):
    __tablename__ = 'student'
    id = Column(INT, primary_key=True, autoincrement=True)
    name = Column(VARCHAR(32))
    # 外键关联,表名,小写
    class_id = Column(INT, ForeignKey('classname.id'))
    # relationship 类名,大写
    # backref: 反向查询关键字
    stu_to_class = relationship('ClassName', backref='class_to_stu')


class ClassName(Base):
    __tablename__ = 'classname'
    id = Column(INT, primary_key=True, autoincrement=True)
    class_name = Column(VARCHAR(32))


# 创建引擎
engine = create_engine('mysql+pymysql://root:123@192.168.1.163:3306'
                       '/foreign_test?charset=utf8')

Base.metadata.create_all(engine)

2.2插入数据、查看数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from 外键一对多.create_table_ForeignKey import Student, ClassName

# 1.创建引擎
engine = create_engine('mysql+pymysql://root:123@192.168.1.163:3306'
                       '/foreign_test?charset=utf8')

# 2.有一个会话窗口
Session_window = sessionmaker(engine)

# 3.建立会话
db_session = Session_window()

2.2.1 插入数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 正向外键关联插入数据
# db_session.add(Student(name='leon', stu_to_class=ClassName(class_name='linux')))

# 反向插入数据
class_obj = ClassName(class_name='GoLang')
class_obj.class_to_stu = [Student(name='Bob'), Student(name='shit')]
db_session.add(class_obj)

2.2.2 查看数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 外键关联正向查询
# stu_list = db_session.query(Student).filter(Student.id >= 1)
# for stu_obj in stu_list:  # type: Student
#     print(stu_obj.name, stu_obj.stu_to_class.class_name)

# 外键关联反向查询
class_list = db_session.query(ClassName).filter(ClassName.id >= 2).all()
for class_obj in class_list:
    class_name = class_obj.class_name
    # 根据班级反向取到所有的学生
    students_list = class_obj.class_to_stu
    for stu_obj in students_list:
        print(class_obj, stu_obj)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db_session.commit()
db_session.close()

3.多对多操作

3.1 创建表,注意 secondary 关键字

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import VARCHAR, INT, Column, create_engine, ForeignKey

Base = declarative_base()


class Man(Base):
    __tablename__ = 'man'
    id = Column(INT, primary_key=True)
    name = Column(VARCHAR(32))
    # secondary: 中间媒介
    # backref: 反向查询关键字
    # secondary: 媒介类是 couples
    man_to_woman = relationship('Woman', backref='woman_to_man', secondary='couples')


class Woman(Base):
    __tablename__ = 'woman'
    id = Column(INT, primary_key=True)
    name = Column(VARCHAR(32))


# 一个 man 可以对应多个 woman
# 一个 woman 可以对应多个 man
class Couples(Base):
    __tablename__ = 'couples'
    id = Column(INT, primary_key=True)
    man_id = Column(INT, ForeignKey('man.id'))
    woman_id = Column(INT, ForeignKey('woman.id'))


engine = create_engine('mysql+pymysql://root:123@192.168.1.163:3306'
                       '/many_test?charset=utf8')
Base.metadata.create_all(engine)

3.2 插入数据、查看数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from 外键一对多.create_table_ForeignKey import Student, ClassName

# 1.创建引擎
engine = create_engine('mysql+pymysql://root:123@192.168.1.163:3306'
                       '/many_test?charset=utf8')

# 2.有一个会话窗口
Session_window = sessionmaker(engine)

# 3.建立会话
db_session = Session_window()

3.2.1 插入数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 增加数据,正向relationship
# man_obj = Man(name='李雷')
# man_obj.man_to_woman = [Woman(name='罗玉凤'), Woman(name='韩梅梅')]
# db_session.add(man_obj)


# 增加数据,方向relationship
woman_obj = Woman(name='王菲')
woman_obj.woman_to_man = [Man(name='窦唯'), Man(name='李亚鹏')]
db_session.add(woman_obj)

2.2.2 查询数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 正向操作
# man_list = db_session.query(Man).filter(Man.id >= 1).all()
# for man_obj in man_list:
#     man_name = man_obj.name
#     woman_list = man_obj.man_to_woman
#     for woman_obj in woman_list:
#         print(man_name, woman_obj.name)

# 反向操作  
man_list = db_session.query(Woman).filter(Woman.name == '王菲').first().woman_to_man
for man_obj in man_list:
    print(man_obj.name)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db_session.commit()
db_session.close()

4.部分高级操作

4.1 创建表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, VARCHAR, INT, create_engine
from sqlalchemy.orm import sessionmaker

Base = declarative_base()


class User(Base):
    __tablename__ = 'user'
    id = Column(INT, primary_key=True, autoincrement=True)
    name = Column(VARCHAR(32), index=True)
    age = Column(INT)
    gender = Column(VARCHAR(8))


engine = create_engine('mysql+pymysql://root:123@192.168.1.163:3306'
                       '/senior_test?charset=utf8')
Base.metadata.create_all(engine)

4.2 查看数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sqlalchemy.orm import sessionmaker
from 高级操作.create_table import User

engine = create_engine('mysql+pymysql://root:123@192.168.1.163:3306'
                       '/senior_test?charset=utf8')

Session_window = sessionmaker(engine)
db_session = Session_window()

4.2.1 or_

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# or_
# id=1 或者 id=3 的
# user_list = db_session.query(User).filter(or_(User.id == 1, User.id == 3)).all()
# for user_obj in user_list:
#     print(user_obj.__dict__)

4.2.2 and_

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# and_
# 新版本其实 逗号本身已经带了 and_ 的这效果,看情况使用
# user_list = db_session.query(User).filter(and_(User.id == 1, User.name == '张三'))
# for user_obj in user_list:
#     print(user_obj.__dict__)

4.2.3 query(指定字段)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查询特定字段,只会查出指定字段
# user_list = db_session.query(User.name, User.gender).all()
# for user_obj in user_list:
#     print(user_obj)

4.2.4 order_by 排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 升序
# user_list = db_session.query(User).order_by(User.id).all()
# 降序
# user_list = db_session.query(User).order_by(User.id.desc()).all()
# for user_obj in user_list:
#     print(user_obj.__dict__)

4.2.5 between,在范围内

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# user_list = db_session.query(User).filter(User.id.between(2, 3)).order_by(User.id).all()
# for user_obj in user_list:
#     print(user_obj.__dict__)

4.2.6 in_,在指定集合内

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# user_list = db_session.query(User).filter(User.id.in_([1, 3, 2])).order_by(User.id).all()
# for user_obj in user_list:
#     print(user_obj.__dict__)

4.2.7 notin_,排除指定范围的,与 in_ 互斥

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# user_list = db_session.query(User).filter(User.id.notin_([3, 2])).order_by(User.id).all()
# for user_obj in user_list:
#     print(user_obj.__dict__)

4.3 更新数据

# 本身自增加的写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 引用增加
# 所有的 User.age 全部自增长 1
db_session.query(User).update({User.age: User.age + 1})
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db_session.commit()
db_session.close()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
快速入门Docker(4)——commit镜像|容器数据卷
上篇文章给家讲解了实战练习附带了给大家又聊了下境像讲解的原理,本篇文章主要给家聊一聊关于commit的和容器数据卷相关内容附带一些练习,编写不易:对你有帮助【一键三连,收藏】。看完掌握以下内容:
大数据老哥
2021/02/04
1.2K0
快速入门Docker(4)——commit镜像|容器数据卷
方式一:直接使用命令挂载 -v
从docker的理念说起,docker将应用和环境打包成一个镜像,运行镜像(生成容器)就可以访问服务了。
甜点cc
2022/10/24
5640
方式一:直接使用命令挂载 -v
Docker容器数据卷
这个命令会在宿主机和容器内分别建立两个目录,两个目录是对接的,里面的数据可以共享。如果我们不知道数据卷是否挂载成功时,我们可以通过以下方式来检查数据卷的挂载结果。
李昂君
2021/12/24
1.1K0
Docker容器数据卷
Docker 实用学习笔记(看这一篇就足够了)
开始 -> Docker 在本机寻找对象 -> 判断本机是否有这个镜像 -> 没有则去下载 Docker Hub 这个镜像 —> 找不到镜像就返回错误(否则就下载镜像到本地)
Gorit
2021/12/08
2.5K0
Docker 实用学习笔记(看这一篇就足够了)
【Docker 系列】docker 学习六,探究一下数据卷容器
Dockerfile 就是用来构建 docker 镜像的构建文件,关于 Dockerfile 详细的我们在后面一期说到,此处先用用
阿兵云原生
2023/02/16
3410
Docker教程(超全总结)[通俗易懂]
如果需要通俗地描述容器的话,我觉得容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说的容器存放的东西可能更偏向于应用比如网站、程序甚至是系统环境。
全栈程序员站长
2022/11/04
3.3K0
Docker教程(超全总结)[通俗易懂]
docker(初识Dockerfile)
Dockerfile 就是用来构建docker镜像的构建文件!命令脚本!先体验一下!
崔笑颜
2020/10/29
4110
docker(初识Dockerfile)
【Docker】007-Docker容器数据卷
当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的,而且容器之间我们希望能够实现数据共享;
訾博ZiBo
2025/01/06
1260
【Docker】007-Docker容器数据卷
Docker 高级
数据 不应该放在容器中,因为容器一旦删除,数据就会丢失! 数据卷就相当于数据可持久化。
收心
2022/01/20
9630
Docker 高级
docker(容器数据卷)
所有的docker容器内的卷,没有指定目录的情况下都是在**/var/lib/docker/volumes/自定义的卷名/_data**下, 如果指定了目录,docker volume ls 是查看不到的。
崔笑颜
2020/10/29
1.3K0
docker(容器数据卷)
5.docker容器数据卷
1. docker数据卷的添加方式, 有两种: 命令添加, dockerfile添加
用户7798898
2020/09/27
4540
5.docker容器数据卷
Docker | 数据持久化与数据共享
参考另一篇Docker安装mysql: https://www.cnblogs.com/all-smile/p/16778376.html
甜点cc
2022/10/24
3510
Docker | 数据持久化与数据共享
【Docker 系列】docker 学习 五,容器数据卷
「再思考一个问题」,容器之间是相互隔离的,如果我们在容器中部署类似 mysql 这样的组件,如果把该容器删除掉,那么 mysql 的数据也会被删掉了,数据丢失了,咱们删库跑路真刺激
阿兵云原生
2023/02/16
4620
Docker重学系列之高级数据卷配置
容器数据卷就是目录的挂载,将我们的容器的目录挂载到宿主机上,从而实现打通宿主机和容器之间的文件共享功能;
大忽悠爱学习
2022/05/10
5590
Docker重学系列之高级数据卷配置
Docker之容器数据卷
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。
yuanshuai
2022/08/22
5100
Docker之容器数据卷
Docker | 使用dockerfile生成镜像,清理docker空间
我个人使用的是单核2G的云服务器,用了快三年了,内存、cpu严重吃紧,所以就尝试了清理docker使用空间,主要是删除未使用过的镜像、容器、数据卷、网络命令,具体如下:
甜点cc
2022/10/24
1.3K0
Docker | 使用dockerfile生成镜像,清理docker空间
Docker之快速搞定容器数据卷
  前面我们介绍了镜像和容器,通过镜像我们可以启动多个容器,但是我们发现当我们的容器停止获取删除后,我们在容器中的应用的一些数据也丢失了,这时为了解决容器的数据持久化,我们需要通过容器数据卷来解决这个问题,本文我们就来介绍下容器数据卷。
用户4919348
2019/12/30
7860
Docker之快速搞定容器数据卷
Docker从入门到精通(七)——容器数据共享
比如我们有一个MySQL集群,通过容器启动,那么项目运行过程中的数据是保存在容器中的,假设容器被删除了,数据就丢失了,如果没有数据共享,那你就只能删库跑路了。
IT可乐
2021/12/22
1.1K0
Docker从入门到精通(七)——容器数据共享
docker(数据卷容器)
Docker Hub 中 99%的镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建。
崔笑颜
2020/10/27
1K0
Docker容器数据卷
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。
兮动人
2021/06/11
7270
Docker容器数据卷
相关推荐
快速入门Docker(4)——commit镜像|容器数据卷
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 1.单表操作
    • 1.1创建表
    • 1.2 增、删、改、查
      • 1.2.1 增
      • 1.2.2 删
      • 1.2.3 改
      • 1.2.4 查
  • 2.外键一对多
    • 2.1创建表
    • 2.2插入数据、查看数据
      • 2.2.1 插入数据
      • 2.2.2 查看数据
  • 3.多对多操作
    • 3.1 创建表,注意 secondary 关键字
    • 3.2 插入数据、查看数据
      • 3.2.1 插入数据
      • 2.2.2 查询数据
  • 4.部分高级操作
    • 4.1 创建表
    • 4.2 查看数据
      • 4.2.1 or_
      • 4.2.2 and_
      • 4.2.3 query(指定字段)
      • 4.2.4 order_by 排序
      • 4.2.5 between,在范围内
      • 4.2.6 in_,在指定集合内
      • 4.2.7 notin_,排除指定范围的,与 in_ 互斥
    • 4.3 更新数据
      • # 本身自增加的写法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档