关于sqlalchemy的ORM的使用
二、创建表
- 使用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.都是布尔类型
.....
- 使用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)#创建表函数
- 获取当前时间函数
from sqlalchemy.sql import func
# func.now()表示获取当前时间
from typing_extensions import Annotated
共同时间属性 = Annontated[datetime.datetime,mapped_column(server_default=func.now())]
#其它与定义表时一样使用
- 一对多创建表
#使用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()强行将数据存入数据库。
三、使用数据表、查询记录
- 查询一下类
from slqalchemy import select,
query = select(表名).order_by(表名.字段名)
result = session.execute(query)
- 查询多个类
from slqalchemy import select
query = select(类名列表).join(类名.外键名)
- 查询多个类中的个别字段
query = select(类名.要查询的字段,.....).join_from(类名列表)
#join_from中的类名列表是创建表时就已经关联了
#当两个表中有相同的名称时,就只会用字段_1,字段_2.....,也可以用别名。如下:
query = select(类名.要查询的字段.label('别名'))
#别名的作用是使用数据时能用到
#以上是内连结,内连结的意思是其中一个字段没有关联,就查询不到
query = select(类名.要查询的字段,.....)\
.select_from(outerjoin(类名列表))
#或
query = select(类名.要查询的字段,.....).join(类名.被关联字段,isouter=True)
#以上是外连结,外连结的意思是其中一个字段没有关联,也可以查询到。
- where条件
==等于,!=不等于,contains包含
#基于对象查询
对象 = session.get(类名,类名的id)
query = select(类名).where(类名.外键名=对象)
# 基于id查询
query = select(类名).where(类名.外键名.id=id)
三、批量插入数据
- 没有关联的插入
from sqlalchemy.orm import Session
session = Session(engine)
# 使用insert
session.execute(
insert(类名).values(数据列表,注数据是字典)
)
session.commit()
- 批量关联的插入
from sqlalchemy.orm import Session
with Session(engine) as session:
session.excute(
inser(表名).values([
{
'字段':value,
'关联名':select(被关联表名.字段).where(被关联表名.字段=value),
.....
},
.......
])
)
#可以通过查询直接属值
- 批量更新
from sqlalchemy.orm import Session
with Session(engine) as session:
session.excute(
update(表名),[
{'id':value,字段:value,....},
......
]
)
session.commit()
- 批量删除
from sqlalchemy.orm import Sesseion
with Session(engine) as sesseion:
session.excute(
delete(表名).where(条件)
)
#在条件中查询是否包含相应的值
表名.字段.in_(值列表)
四、关于with…as…:的使用
with…as…:是执行完包含的代码后自动关闭、如果代码有错误会自动跳出。如果有连结或读取代取,代码执行完了后就关闭。
- sqlalchemy关于连结数据库的方法
from sqlalchemy.orm import Session
with Session(engin) as session,session.begin():
........
#session.begin()表示会自动提交事务,所以在with...as ...:中就不用session.commit()代码了