前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SALalchemy增删改查

SALalchemy增删改查

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

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 删除。

评论
登录后参与评论
2 条评论
热度
最新
报/bin/sh: ./hello: not found这个错误
报/bin/sh: ./hello: not found这个错误
回复回复点赞举报
构建镜像成功,跑镜像不成功,后面改成构建镜像,不启动hello的方法,这个时候进去容器后,执行hello,报错
构建镜像成功,跑镜像不成功,后面改成构建镜像,不启动hello的方法,这个时候进去容器后,执行hello,报错
回复回复点赞举报
推荐阅读
[Docker]如何使用Docker部署一个go程序
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
宇宙无敌暴龙战士之心悦大王
2023/03/06
1.8K0
Docker Getting started with Java
Docker 官网提供了 python,nodejs,java 3种不同编程语言的 Language-specific guides 学习指南。该指南详细说明了如何编写 Dockerfile 文件,部署 Docker 容器以及构建 CI/CD pipline。
Se7en258
2021/05/18
2K0
Docker Getting started with Java
使用dockerfile部署项目(附详细步骤)
Dockerfile 是一个文本文件,它包含了所有用于组合Docker镜像所需的指令和参数。这些指令和参数基于Docker镜像的层的概念,并定义了如何从一个基础镜像开始,通过添加、修改文件、安装软件包、配置环境变量和设置启动命令等操作,最终构建出一个新的Docker镜像
红队蓝军
2024/07/26
2.8K0
使用dockerfile部署项目(附详细步骤)
Docker--Compose介绍(三)
Docker Compose是一个用来定义和运行复杂应用的Docker工具。使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。
Kevin song
2022/11/19
4590
Docker--Compose介绍(三)
Docker Compose 项目打包部署
参考官方:https://docs.docker.com/compose/compose-file/
IT茂茂
2020/03/19
5.4K0
Docker - 制作Nodejs镜像
本文基于腾讯云云服务器CVM系统工具配置文章的基础上,在腾讯云云服务器(CentOS系统)上基于镜像文件Dockerfile制作 Nodejs 镜像。
lqmeta
2022/02/13
6.4K0
Docker|基础篇
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
用户3467126
2019/07/03
1.1K0
Docker|基础篇
详解Docker——你需要知道的Docker进阶知识五
Dockerfile 是一个文本文件,其中包含了构建 Docker 镜像需要执行的命令序列。使用 docker build 命令从 Dockerfile 中读取指令来构建镜像。
云原生
2021/05/31
9630
Docker快速入门
docker stop/start container-id 停止/启动指定 id 的容器
爽朗地狮子
2022/10/20
1.1K0
一文零基础教你学会 Docker 入门到实践
Docker 自 2013 年发布至今一直备受关注,从招聘面试角度来看有些职位对于了解 Docker、K8S 这些也有一些加分项,同时学习 Docker 也是后续学习 K8S 的基础,但是对于 Docker 很多人也需并不了解,其实 Docker 也并没有那么难,本文从 Docker 入门到应用实践为大家进行讲解,中间也列举了很多实例,希望能帮助大家更好的理解。
五月君
2019/09/27
7950
一文零基础教你学会 Docker 入门到实践
Docker与Docker Compose入门:释放你的应用部署的威力
嘿,大家好!今天给大家介绍一项强大而有趣的技能,那就是使用 Docker 和 Docker Compose 来释放你的应用部署的威力!无论你是一名开发人员还是系统管理员,掌握这个技能都将为你的工作带来巨大的好处。
wayn
2024/01/18
9750
Docker与Docker Compose入门:释放你的应用部署的威力
Docker在PHP项目开发环境中的应用
环境部署是所有团队都必须面对的问题,随着系统越来越大,依赖的服务也越来越多,比如我们目前的一个项目就会用到: - Web服务器:Nginx - Web程序:PHP + Node - 数据库:MySQL - 搜索引擎:ElasticSearch - 队列服务:Gearman - 缓存服务:Redis + Memcache - 前端构建工具:npm + bower + gulp - PHP CLI工具:Composer + PHPUnit 因此团队的开发环境部署随之暴露出若干问题: 1. 依赖服务很多,本
前朝楚水
2018/04/03
2.7K0
.NET Core容器化之多容器应用部署@Docker-Compose
1.引言 紧接上篇.NET Core容器化@Docker,这一节我们先来介绍如何使用Nginx来完成.NET Core应用的反向代理,然后再介绍多容器应用的部署问题。 2. Why Need Nginx .NET Core中默认的Web Server为Kestrel。 Kestrel is great for serving dynamic content from ASP.NET, however the web serving parts aren’t as feature rich as ful
圣杰
2018/01/11
1.8K0
.NET Core容器化之多容器应用部署@Docker-Compose
基于Jenkins的CICD
首次启动会因为数据卷data目录没有权限导致启动失败,设置data目录写权限(/usr/local/docker/jenkins_docker/data)
九转成圣
2024/04/10
1400
基于Jenkins的CICD
Docker从入门到精通(八)——Docker Compose
恭喜大家,学到这里,对于 docker 的基础玩法大家应该都会了,下面会介绍 docker的一些编排工具。
IT可乐
2021/12/27
8790
Docker从入门到精通(八)——Docker Compose
使用docker部署caddy暨buildx编译多架构镜像
由于 caddy 使用了 cf 的 dns 插件,更新的时候比较麻烦,所以想着使用 docker 来部署,自己只需要 build 最新的 caddy 镜像就可以了。
tanmx
2023/10/18
1.2K0
使用 docker 轻松部署你的 Go 项目
如果你是一名 Go 开发者,你一定知道用 Go 写代码是一件多爽的事,高效而简洁。那么如果我告诉你,部署 Go 项目同样也可以这么轻松愉快呢?这就是 Docker 的魅力所在。
陈明勇
2024/10/24
1.9K0
使用 docker 轻松部署你的 Go 项目
Docker Compose 1.18.0 之服务编排详解
一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose,不再需要使用shell脚本来启动容器。在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器
程序员鹏磊
2018/01/18
1.5K0
Docker Compose 1.18.0 之服务编排详解
docker 及 docker-compose 的快速安装和简单使用
通过下面的一个脚本可以简单快速的创建一个镜像并运行起来 大概看下应该就可以大概明白镜像的基本使用了
易墨
2018/09/14
1.8K0
Docker实践(五):Docker Compose
 Compose是用于定义和运行多个Docker应用的工具。使用yaml文件可以快速的创建和管理基于Docker容器的应用集群。
loong576
2019/09/10
1.3K0
Docker实践(五):Docker Compose
相关推荐
[Docker]如何使用Docker部署一个go程序
更多 >
LV.0
奇虎360服务端资深工程师
目录
  • 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 归档