SQLAIchemy(二)ORM 相关
0. 前言
- 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术
- 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。Sqlalchemy 就是一种 ORM 框架
- 每个表会对应一个 Model 类,这些 Model 类都需要继承一个名为 declarative base class 的基类。我们需要通过下面的代码来获得这个基类:
from sqlalchemy.ext.declarative import declarative_base BASE = declarative_base()
有了这个基类,就可以定义各个表的 Model 类了:
class User(BASE):
__tablename__ = "users" id = Column(INTEGER, primary_key=True)
name = Column(CHAR(127))
password = Column(CHAR(127))
- 然后添加记录:
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine ENGINE = create_engine("mysql://root:zaq12wsx@localhost:3306/mydb?charset=utf8",
convert_unicode=True)
Session = sessionmaker(bind=ENGINE, autocommit=False, autoflush=False) session = Session() user = User()
user.name = "user1"
user.password = "password"
session.add(user)
session.commit()
- 注意:session.commit() 是指事务提交,提交后无法回滚。session.flush() 也会写入数据库,但是可以执行 session.rollback() 回滚
1. 详细操作
1.1 建表
- 在 SQLAlchemy 中,以 ORM 方式定义表有两种方法,分别是 Classical 和 Declarative,Flask-Sqlalchemy主要使用的是 Declarative 方法:
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base() from sqlalchemy import Column, Integer, String def declarative_base(bind=None, metadata=None, mapper=None, cls=object,
name='Base', constructor=_declarative_constructor,
class_registry=None,
metaclass=DeclarativeMeta): class _BoundDeclarativeMeta(DeclarativeMeta):
def __init__(self, name, bases, d):
bind_key = d.pop('__bind_key__', None)
DeclarativeMeta.__init__(self, name, bases, d)
if bind_key is not None:
self.__table__.info['bind_key'] = bind_key def make_declarative_base(self, metadata=None):
"""Creates the declarative base."""
base = declarative_base(cls=Model, name='Model',
metadata=metadata,
metaclass=_BoundDeclarativeMeta)
base.query = _QueryProperty(self)
return base AdABCModelBase = make_declarative_base() class ABCAuth(AdABCModelBase):
'''
ABC 授权
'''
__tablename__ = 'ABC_auth'
__bind_key__ = 'ABC'
__model_version__ = '2018-06-07' id = Column(BigInteger, primary_key=True)
# ABCProductLibrary/ABCBehaviour id
target_id = Column(BigInteger, default=0)
type = Column(SmallInteger, default=0)
av_id = Column(BigInteger, default=0)
available = Column(Boolean, default=True)
isdel = Column(Boolean, default=False)
create_time = Column(DateTime)
modify_time = Column(DateTime)
- declarative_base 的参数有:
- cls = Model
- metadata = metadata(None)
- metaclass = _BoundDeclarativeMeta
- _BoundDeclarativeMeta 是对 DeclarativeMeta 的一个简单包装
1.2 查询
- 通常通过 query 查询(详情见 SQLchemy 学习(一)Session 相关):
from sqlalchemy.orm import Session
session = Session(engine)
query = session.query(ABCAuth)
- 自定义对象查询:
query = ABCVideoPackage.query.filter(ABCVideoPackage.status != ABCVideoPackageStatus.DELETED)
2. 参考文献
SQLAIchemy(二)ORM 相关的更多相关文章
- Jsoup代码解读之二-DOM相关对象
Jsoup代码解读之二-DOM相关对象 之前在文章中说到,Jsoup使用了一套自己的DOM对象体系,和Java XML API互不兼容.这样做的好处是从XML的API里解脱出来,使得代码精炼了很多 ...
- Django框架详细介绍---ORM相关操作
Django ORM相关操作 官方文档: https://docs.djangoproject.com/en/2.0/ref/models/querysets/ 1.必须掌握的十三个方法 <1& ...
- Django中的ORM相关操作:F查询,Q查询,事物,ORM执行原生SQL
一 F查询与Q查询: 1 . F查询: 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的 ...
- Django学习笔记之Django ORM相关操作
一般操作 详细请参考官方文档 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> ...
- Django ORM相关的一些操作
一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...
- Hibernate基础学习(二)—Hibernate相关API介绍
一.Hibernate的核心接口 所有的Hibernate应用中都会访问Hibernate的5个核心接口. (1)Configuration接口: 配置Hibernate,启动Hi ...
- 07 模型层 orm相关查询 F查询Q查询 django开启事务
一.Django终端打印SQL语句 如果你想知道你对数据库进行操作时,Django内部到底是怎么执行它的sql语句时可以加下面的配置来查看 在Django项目的settings.py文件中,在最后复制 ...
- ansible playbook实践(二)-基础相关命令
ansible相关的命令: ansible 用来执行ansible管理命令 ansible-doc 用来获取模块的帮助文档 ansible-playbook 当有众多任务时,可编写成playbook ...
- WebService学习--(二)webservice相关介绍
一.WebService是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨平台的规范(抽象) 3. 多个跨平台.跨语言的应用间通信整合的方案(实际 ...
随机推荐
- 解锁云原生 AI 技能|在 Kubernetes 上构建机器学习系统
本系列将利用阿里云容器服务,帮助您上手 Kubeflow Pipelines. 介绍 机器学习的工程复杂度,除了来自于常见的软件开发问题外,还和机器学习数据驱动的特点相关.而这就带来了其工作流程链路更 ...
- 超详细Pycharm部署项目视频教程
在实际的工作中,不管你是开发.测试还是运维人员,都应该掌握的一项技能就是部署项目,简单说就是把项目放到服务器中,使其正常运行.今天猪哥就以咱们的微信机器人项目为例子,带大家来部署一下项目.本文将会详细 ...
- JVM的监控工具之jconsole
JConsole(Java Monitoring and Management Console)是一种基于JMX的可视化监视.管理工具.管理的是什么?管理的是监控信息.永久代的使用信息.类加载等等 如 ...
- Linux用户和权限——管理用户和用户组的命令
Linux用户和权限——管理用户和用户组的命令 摘要:本文主要学习了在Linux系统中管理用户和用户组的命令. useradd命令 useradd命令可以用来创建新用户. 基本语法 useradd [ ...
- Ansible Jinja2 模板
1.jinja2渲染NginxProxy配置文件 jinja2 房屋建筑设计固定的? jinja2模板与Ansible关系 Ansible如何使用jinja2模板 template模块 拷贝文件? t ...
- [转]awsome c++
原文链接 Awesome C++ A curated list of awesome C++ (or C) frameworks, libraries, resources, and shiny th ...
- python如何通过windows命令行运行一个python程序文件?
python如何通过windows命令行运行一个python程序文件? cmd 进入到py文件对应目录下或者直接在上面的文件地址栏输入cmd,敲入回车 定位到对应的目录下 输入python xxx.p ...
- filebeat + ELK 部署篇
ELK Stack Elasticsearch:分布式搜索和分析引擎,具有高可伸缩.高可靠和易管理等特点.基于 Apache Lucene 构建,能对大容量的数据进行接近实时的存储.搜索和分析操作.通 ...
- 春秋-SQLi题
这道题挺好的 学到的知识 sprintf()构成的sql注入漏洞 题目环境今天做的时候坏了 留下这几篇博客学习 https://blog.csdn.net/nzjdsds/article/detail ...
- liteos互斥锁(七)
1. 概述 1.1 基本概念 互斥锁又称互斥型信号量,是一种特殊的二值性信号量,用于实现对共享资源的独占式处理. 任意时刻互斥锁的状态只有两种,开锁或闭锁.当有任务持有时,互斥锁处于闭锁状态,这个任务 ...