关于sqlalchemy的ORM的使用

发布于:2025-03-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

二、创建表

  1. 使用Mapped来映射字段
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,Mapped,mapped_column

Base = 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 Annotated
 
Base = 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()代码了

网站公告

今日签到

点亮在社区的每一天
去签到