python Sqlalchemy

2023-09-20 12:44:53

简介

SQLAlchemy 是python中,通过ORM操作数据库的框架。它简化了应用程序开发人员在原生SQL上的操作,使开发人员将主要精力都放在程序逻辑上,从而提高开发效率。它提供了一整套著名的企业级持久性模式,设计用于高效和高性能的数据库访问。

安装

pip install SQLAlchemy

连接数据(engine)

任何SQLAlchemy应用程序的开始都是一个Engine对象,此对象充当连接到特定数据库的中心源,提供被称为connection pool的对于这些数据库连接。

Engine对象通常是一个只为特定数据库服务器创建一次的全局对象,并使用一个URL字符串进行配置,该字符串将描述如何连接到数据库。

from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:', echo=True)

create_engine的常用参数

  • echo=False – 如果为真,引擎将记录所有语句以及 repr() 其参数列表的默认日志处理程序。
  • enable_from_linting – 默认为True。如果发现给定的SELECT语句与将导致笛卡尔积的元素取消链接,则将发出警告。
  • encoding – 默认为 utf-8
  • future – 使用2.0样式
  • hide_parameters – 布尔值,当设置为True时,SQL语句参数将不会显示在信息日志中,也不会格式化为 StatementError 对象。
  • listeners – 一个或多个列表 PoolListener 将接收连接池事件的对象。
  • logging_name – 字符串标识符,默认为对象id的十六进制字符串。
  • max_identifier_length – 整数;重写方言确定的最大标识符长度。
  • max_overflow=10 – 允许在连接池中“溢出”的连接数,即可以在池大小设置(默认为5)之上或之外打开的连接数。
  • pool_size=5 – 在连接池中保持打开的连接数
  • plugins – 要加载的插件名称的字符串列表。

数据库连接字符串格式:

dialect+driver://username:password@host:port/database

例如 MySQL:mysql+pymysql://username:password@host:port/database

​ postgresql:postgresql+psycopg2://username:password@host:port/database

声明映射

创建一个映射类,是基于基类定义的,每个映射类都要继承这个基类 declarative_base()

from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    nickname = Column(String)

    def __repr__(self):
       return "<User(name='%s', fullname='%s', nickname='%s')>" % (
                            self.name, self.fullname, self.nickname)

tablename 代表表名

Column : 代表数据表中的一列,内部定义了数据类型,如果字段名称与数据定义的字段名称不一致时,可以在Column中指定

id = Column('user_id',Integer, primary_key=True)

**primary_key:**主键

创建数据库

我们可以通过检查__table__属性查看关于表的信息,称为table metadata:

>>> User.__table__ 
Table('users', MetaData(),
            Column('id', Integer(), table=<users>, primary_key=True, nullable=False),
            Column('name', String(), table=<users>),
            Column('fullname', String(), table=<users>),
            Column('nickname', String(), table=<users>), schema=None)

创建表:

Base.metadata.create_all(engine)

# BEGIN...
# CREATE TABLE users (
#     id INTEGER NOT NULL,
#     name VARCHAR,
#     fullname VARCHAR,
#     nickname VARCHAR,
#     PRIMARY KEY (id)
# )
# [...] ()
# COMMIT

数据操作

添加数据到数据库

创建一个User对象的实例,然后创建会话

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session() # 实例化会话

# 对象实例
user = User(name='ed', fullname='Ed Jones', nickname='edsnickname')
session.add(user)
session.commit() # 提交数据

查询数据

通过 query 关键字查询。

  • query.filter() 过滤
  • query.filter_by() 根据关键字过滤
  • query.all() 返回列表
  • query.first() 返回第一个元素
  • query.one() 有且只有一个元素时才正确返回
  • query.one_or_none(),类似one,但如果没有找到结果,则不会引发错误
  • query.scalar(),调用one方法,并在成功时返回行的第一列
  • query.count() 计数
  • query.order_by() 排序
for instance in session.query(User).filter(User.id > 10).order_by(User.id):
     print(instance.name, instance.fullname)

query.join()

连接查询

session.query(User).join(Address).filter(Address.email_address=='bob@foxmail.com').  all()

查询常用筛选器运算符

# 等于
query.filter(User.name == 'ed')

# 不等于
query.filter(User.name != 'ed')

# like和ilike
query.filter(User.name.like('%ed%'))
query.filter(User.name.ilike('%ed%')) # 不区分大小写

# in
query.filter(User.name.in_(['ed', 'wendy', 'jack']))
query.filter(User.name.in_(
    session.query(User.name).filter(User.name.like('%ed%'))
))
# not in
query.filter(~User.name.in_(['ed', 'wendy', 'jack'])) 

# is
query.filter(User.name == None)
query.filter(User.name.is_(None))

# is not
query.filter(User.name != None)
query.filter(User.name.is_not(None))

# and
from sqlalchemy import and_
query.filter(and_(User.name == 'ed', User.fullname == 'Ed Jones'))
query.filter(User.name == 'ed', User.fullname == 'Ed Jones')
query.filter(User.name == 'ed').filter(User.fullname == 'Ed Jones')

# or
from sqlalchemy import or_
query.filter(or_(User.name == 'ed', User.name == 'wendy'))

# match
query.filter(User.name.match('wendy'))
更多推荐

全局异常处理+JSR303验证

一、前言我们在日常开发中,避不开的就是参数校验,有人说前端不是会在表单中进行校验的吗?在后端中,我们可以直接不管前端怎么样判断过滤,我们后端都需要进行再次判断,为了安全。因为前端很容易拜托,当测试使用PostMan来测试,如果后端没有校验,不就乱了吗?肯定会有很多异常的。今天小编和大家一起学习一下JSR303专门用于参

如何使用Jest生成中文测试报告

前言Jest是一个非常流行的JavaScript测试框架,它提供了丰富的功能和易于理解的测试报告。然而,默认情况下,Jest生成的测试报告是以英文展示的。如果需要生成中文测试报告,我们需要对Jest进行一些配置。以下是一种方法,可以在Jest中生成中文测试报告:安装相关依赖首先,确保已经安装了Node.js和npm。然

C语言 coding style

头文件The#defineGuard#define的保护文件的唯一性,防止被多重包含格式:<PROJECT>_<FILE>_H_PROJECT:XSFILE:MV_CTR头文件的包含顺序CSystemFilesOtherLibrariesUserLibraryConditionalinclude作用域局部变量-变量定义

VMware vCenter 从6.7跨版本升级至7.0U3N

本文尝试使用vCenterServerAppliance管理界面(VAMI)进行对vCenterServerAppliance7应用进行小版本升级,从6.7.0.47000升级到7.0.3.01600(7.0U3N)。一、升级前的准备工作1、检查当前运行环境(当前为6.7.0.47000)2、核实当前ESXi版本均在兼

提高接口自动化测试效率:使用 JMESPath 实现断言和数据提取!

前言做接口自动化,断言是比不可少的。如何快速巧妙的提取断言数据就成了关键,当然也可以提高用例的编写效率。笔者在工作中接触到了JMESPath,那到底该如何使用呢?带着疑惑一起往下看。JMESPath是啥?JMESPath是一种用于查询和转换JSON数据的简洁、强大的查询语言。它提供了一种灵活的方式来从复杂的JSON结构

思腾云计算

近年来,游戏行业发展迅猛,市场容量不断扩大。从游戏产业发展来看,玩家对于游戏内容和体验的需求不断攀升。那如何在同质化的游戏市场,通过AI来提高游戏探索和交互的趣味度?行业存在以下痛点:1、游戏迭代速度加快,如何加速研发创新,提供多元化的游戏体验;2、在线多人竞技类游戏因玩家能力不均,均衡对局匹配耗时长,对局质量差,再加

Spring注解家族介绍: @RequestMapping

前言:今天我们来介绍@RequestMapping这个注解,这个注解的内容相对来讲比较少,篇幅会比较短。目录前言:@RequestMapping应用场景:总结:@RequestMapping@RequestMapping是一个用于映射HTTP请求到处理方法的注解,它可以用在控制器类和处理方法上。当请求到达服务器时,根据

lv4 嵌入式开发-9 静态库与动态库的使用

目录1库的概念2库的知识3静态库特点4静态库4.1静态库创建4.2编译生成目标文件4.3创建静态库hello4.4查看库中符号信息4.5链接静态库5共享库特点6共享库6.1共享库创建6.2编译生成目标文件6.3创建共享库common6.4为共享库文件创建链接文件6.5编写应用程序6.6编译test.c并链接共享库lib

Java基于SpringBoot的漫画网站,附源码,教程

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌今天为大家带来的是基于SpringBoot+Vue的漫画之家系统,亲测可用,可以作为课程设计,毕业设计适用。文章目录1、前言介绍2.技术栈3系统分析3.

爬虫获取接口数据

上一讲讲的是获取静态网页数据的教程,适用于我们要爬取的数据在网页源代码中出现,但是还是有很多的数据是源代码中没有的,需要通过接口访问服务器来获得,下面我就来讲讲如何爬取这类数据。以巨潮资讯网爬取比亚迪企业年报为例。正常人的操作打开巨潮资讯网官网找到比亚迪的公告在分类里面选择筛选信息,找到自己想要的信息爬虫的思路获取请求

Vue 使用vue-pdf 显示pdf文件 切换页面 缩放 全屏 自动播放等

<template><divid="container"><!--上一页、下一页--><divclass="right-btn"><div@click="toFullOrExit"class="turn-btn"><span>{{isFull==1?"取消全屏":"全屏"}}</span></div><div@clic

热文推荐