当前位置: 首页 > news >正文

关于sqlalchemy的ORM的使用

关于sqlalchemy的ORM的使用

  • 二、创建表
  • 三、使用数据表、查询记录
  • 三、批量插入数据
  • 四、关于with...as...:的使用

二、创建表

  1. 使用Mapped来映射字段
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,Mapped,mapped_columnBase = declarative_base()
engine = create_engine('sqlite:///数据库位置')
Session = sessionmaker()class 类名(Base):__tablename__ = '数据库中的表名'字段名:Mapped[类型] = Mapped_column(限制条件)#限制条件有primary_key,unique,nullable.都是布尔类型 .....
  1. 使用Annotated定义共同属性字段
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,Mapped,mapped_column
from typing_extensions import AnnotatedBase = declarative_base()
engine = create_engine('sqlite:///数据库位置')
Session = sessionmaker()
共同属性 = Annotated[类型,mapped_column(限制条件)]
#注解的方式将字段类型定义好了class 类名(Base):__tablename__ = '数据库的的表名'字段名:Mapped[共同属性]......def __repr__(self):return f'字段:{self.字段名}'#__repr__表示查询返回的值Base.metadata.create_all(engine)#创建表函数
  1. 获取当前时间函数
from sqlalchemy.sql import func
# func.now()表示获取当前时间
from typing_extensions import Annotated共同时间属性 = Annontated[datetime.datetime,mapped_column(server_default=func.now())]
#其它与定义表时一样使用
  1. 一对多创建表
#使用id来定义
# 在mapped_column中添加ForeignKey('被关联表名.id').如:
mapped_column(ForeignKey('被关联表名.id'))
关联表字段:Mapped[类型] = mapped_column(ForeignKey('被关联表名.id'))
#整体表传入
被关联表名(小写):Mapped[被关联表名] = relationship(lazy=False | True(默认))
#正向查询
关联表名.被关联表名(小写)#就可以查询被关联表的值
#lazy=False时,关联表和被关联表一起查询
#lazy=True时,只有调用关联表名.被关联表名时才查询
#反向查询
被关联表名(小写):Mapped[被关联表名] = relationship(lazy=False | True(默认),backref='查询被关联表的变量')

双向查询定义(第二种方法)
在被关联表中定义关联关联表
注:List(from typing import List)
关联表字段名:Mapped[List[“关联表名”]] = relationship(back_populates=‘被关联表名字段’)
在关联表中定义关联被关联表
被关联表名(小写):Mapped[被关联表名] = relationship(back_populates=‘关联表名字段’))。如:
在这里插入图片描述

注:可以用session.flush()强行将数据存入数据库。

三、使用数据表、查询记录

  1. 查询一下类
from slqalchemy import select,
query = select(表名).order_by(表名.字段名)
result = session.execute(query)
  1. 查询多个类
from slqalchemy import select
query = select(类名列表).join(类名.外键名)
  1. 查询多个类中的个别字段
query = select(类名.要查询的字段,.....).join_from(类名列表)
#join_from中的类名列表是创建表时就已经关联了
#当两个表中有相同的名称时,就只会用字段_1,字段_2.....,也可以用别名。如下:
query = select(类名.要查询的字段.label('别名'))
#别名的作用是使用数据时能用到
#以上是内连结,内连结的意思是其中一个字段没有关联,就查询不到
query = select(类名.要查询的字段,.....)\
.select_from(outerjoin(类名列表))
#或
query = select(类名.要查询的字段,.....).join(类名.被关联字段,isouter=True)
#以上是外连结,外连结的意思是其中一个字段没有关联,也可以查询到。
  1. where条件
    ==等于,!=不等于,contains包含
#基于对象查询
对象 = session.get(类名,类名的id)
query = select(类名).where(类名.外键名=对象)
# 基于id查询
query = select(类名).where(类名.外键名.id=id)

三、批量插入数据

  1. 没有关联的插入
from sqlalchemy.orm import Session
session = Session(engine)
# 使用insert
session.execute(insert(类名).values(数据列表,注数据是字典)
)
session.commit()
  1. 批量关联的插入
from sqlalchemy.orm import Session
with Session(engine) as session:session.excute(inser(表名).values([{'字段':value,'关联名':select(被关联表名.字段).where(被关联表名.字段=value),.....},.......]))
#可以通过查询直接属值
  1. 批量更新
from sqlalchemy.orm import Session
with Session(engine) as session:session.excute(update(表名),[{'id':value,字段:value,....},......])session.commit()
  1. 批量删除
from sqlalchemy.orm import Sesseion
with Session(engine) as sesseion:session.excute(delete(表名).where(条件))
#在条件中查询是否包含相应的值
表名.字段.in_(值列表)

四、关于with…as…:的使用

with…as…:是执行完包含的代码后自动关闭、如果代码有错误会自动跳出。如果有连结或读取代取,代码执行完了后就关闭。

  1. sqlalchemy关于连结数据库的方法
from sqlalchemy.orm import Session
with Session(engin) as session,session.begin():........
#session.begin()表示会自动提交事务,所以在with...as ...:中就不用session.commit()代码了

http://www.mrgr.cn/news/94188.html

相关文章:

  • Spring Security的作用
  • 浏览器控制台的特殊执行方式,暂存变量的作用域 和 同步/异步行为解释
  • 13 | 实现统一的错误返回
  • C# 通过chrome插件将HTML网页转换为PDF
  • JVM内存结构笔记03-方法区
  • 18 | 实现简洁架构的 Handler 层
  • 系统开发资源
  • 51c自动驾驶~合集54
  • IEC61850标准下MMS 缓存报告控制块 ResvTms详细解析
  • JVM内存结构笔记04-字符串常量池
  • 15 | 定义简洁架构 Store 层的数据类型
  • CMD批处理一些冷门命令,编写windows脚本常用?
  • 10 | 基于 Gin 实现 HTTP 服务器
  • vue 仿deepseek前端开发一个对话界面
  • 如何搭建一个适配微信小程序,h5,app的uni-app项目
  • Go Ebiten小游戏开发:俄罗斯方块
  • halcon机器人视觉(四)calibrate_hand_eye_stationary_3d_sensor
  • JAVA 基础语法备忘录 -
  • 01 | Go 项目开发极速入门课介绍
  • 如何搭建一个适配微信小程序,h5,app的工程