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. Elasticsearch 在业界的大量应用案例

    国内现在有大量的公司都在使用 Elasticsearch,包括携程.滴滴.今日头条.饿了么.360安全.小米.vivo等诸多知名公司.

  2. 基于opencv 识别、定位二维码 (c++版)

    前言 因工作需要,需要定位图片中的二维码:我遂查阅了相关资料,也学习了opencv开源库.通过一番努力,终于很好的实现了二维码定位.本文将讲解如何使用opencv定位二维码. 定位二维码不仅仅是为了识 ...

  3. C# - MD5验证

    前言 本篇主要记录:VS2019 WinFrm桌面应用程序实现字符串和文件的Md5转换功能.后续系统用户登录密码保护,可采用MD5加密保存到后台数据库. 准备工作 搭建WinFrm前台界面 如下图 核 ...

  4. c++和java的一些debug方法

    就上面那个绿色的小瓢虫,点了就进了debug模式. 好尴尬啊,就说一句话. 而且,要加断点,不然就一下debug完了.

  5. python学习2-数据库配置操作

    1.创建实体类models-自定义数据库的字段与名称 class Register (models.Model): idCard=models.CharField(max_length=18) pwd ...

  6. 获取APK的appPackage和appActivity

    [法二]AndroidSDK 此方法是采用AndroidSDK\build-tools\23.0.2(这个版本号可能不一定,但是一般每个版本号里面都,任意即可)\aapt.exe aapt dump ...

  7. LSTM——长短时记忆网络

    LSTM(Long Short-term Memory),长短时记忆网络是1997年Hochreiter和Schmidhuber为了解决预测位置与相关信息之间的间隔增大或者复杂语言场景中,有用信息间隔 ...

  8. 2019CCPC 秦皇岛 E.Escape

    传送门 题意: 给出一个\(n*m\)的迷宫,有\(a\)个入口,\(b\)个出口. 现在有\(a\)个机器人都从入口出发,一开始方向默认为下,你可以选在在一些格子上面放置一个转向器,转向器有四种: ...

  9. RegxUtils正则表达式工具类

    public class RegxUtils { //------------------常量定义 /** * Email正则表达式="^([a-z0-9A-Z]+[-|\\.]?)+[a- ...

  10. Mysql使用语法总结

    查看数据库 show databases; 使用数据库 use honeypot; 查看数据表 show tables; 查看数据表结构 desc TABLEname; 修改数据表的某个字段的类型 a ...