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 查询

from sqlalchemy.orm import Session
session = Session(engine)
query = session.query(ABCAuth)
  • 自定义对象查询:
query = ABCVideoPackage.query.filter(ABCVideoPackage.status != ABCVideoPackageStatus.DELETED)

2. 参考文献

SQLAIchemy(二)ORM 相关的更多相关文章

  1. Jsoup代码解读之二-DOM相关对象

    Jsoup代码解读之二-DOM相关对象   之前在文章中说到,Jsoup使用了一套自己的DOM对象体系,和Java XML API互不兼容.这样做的好处是从XML的API里解脱出来,使得代码精炼了很多 ...

  2. Django框架详细介绍---ORM相关操作

    Django ORM相关操作 官方文档: https://docs.djangoproject.com/en/2.0/ref/models/querysets/ 1.必须掌握的十三个方法 <1& ...

  3. Django中的ORM相关操作:F查询,Q查询,事物,ORM执行原生SQL

    一    F查询与Q查询: 1 . F查询: 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的 ...

  4. Django学习笔记之Django ORM相关操作

    一般操作 详细请参考官方文档 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> ...

  5. Django ORM相关的一些操作

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...

  6. Hibernate基础学习(二)—Hibernate相关API介绍

    一.Hibernate的核心接口      所有的Hibernate应用中都会访问Hibernate的5个核心接口.      (1)Configuration接口: 配置Hibernate,启动Hi ...

  7. 07 模型层 orm相关查询 F查询Q查询 django开启事务

    一.Django终端打印SQL语句 如果你想知道你对数据库进行操作时,Django内部到底是怎么执行它的sql语句时可以加下面的配置来查看 在Django项目的settings.py文件中,在最后复制 ...

  8. ansible playbook实践(二)-基础相关命令

    ansible相关的命令: ansible  用来执行ansible管理命令 ansible-doc 用来获取模块的帮助文档 ansible-playbook 当有众多任务时,可编写成playbook ...

  9. WebService学习--(二)webservice相关介绍

    一.WebService是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨平台的规范(抽象) 3. 多个跨平台.跨语言的应用间通信整合的方案(实际 ...

随机推荐

  1. 【UOJ#60】【UR #5】怎样提高智商

    [UOJ#60][UR #5]怎样提高智商 题面 UOJ 题解 首先猜猜答案是\(4*3^{n-1}\).即前面的选啥都行,后面的搞搞就行了. 而打表(看题解),可以知道答案就是这个,并且每个问题都是 ...

  2. MySQL for OPS 05:日志管理

    写在前面的话 日志是作为用户排查服务问题的重要依据,在 MySQL 中日志可以分为几类,各自产生着不同的作用.如 error log / bin log / slow log 等.很多时候优化数据库的 ...

  3. 我脑中的JVM大全附带Java8的特性

    Java虚拟机-sun classic vm 世界上第一款商用的Java虚拟机. 只能使用纯解释器的方式来执行Java代码. Java虚拟机-ExactVM Exact Memory Manageme ...

  4. 【转】Linux上安装rz和sz命令

    简介 lrzsz 官网入口:http://freecode.com/projects/lrzsz/ lrzsz是一个unix通信套件提供的X,Y,和ZModem文件传输协议 windows 需要向ce ...

  5. flink Transitive Closure算法,实现寻找新的可达路径

    flink 使用Transitive Closure算法实现可达路径查找. 1.Transitive Closure是翻译闭包传递?我觉得直译不准确,意译应该是传递特性直至特性关闭,也符合本例中传递路 ...

  6. 相同域名下的cookie污染

    问题描述 本地用同一个tomcat调试两个相同框架的不同项目,在同一个浏览器界面里切换时,A项目的登录会把B项目的登录给踢掉,翻反过来亦如此.通过查看浏览器cookie,发现两个项目的cookie完全 ...

  7. 详解Vue的slot新用法

    摘要: 理解Vue插槽. 作者:前端小智 原文:vue 2.6 中 slot 的新用法 Fundebug经授权转载,版权归原作者所有. 为了保证的可读性,本文采用意译而非直译. 最近发布不久的Vue ...

  8. poi操作Word创建超链接

    项目引入poi: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ ...

  9. Oracle使用命令行登录提示ERROR: ORA-01017: invalid username/password; logon denied

    刚在Windows上面安装好Oracle 10g,刚开始使用PLSQLDevelop软件登录提示  not logged on ,然后使用命令行登录提示 ERROR: ORA-01017: inval ...

  10. 常用的linux命令大全

    之前做过两年的运维,用过很多命令,深切体会到某些linux命令熟练掌握后对效率提升有多大.举个简单的例子,在做了研发后经常会有跑一些数据,对于结果数据的处理,我们的产品同学一般都习惯于用excel做统 ...