首页 > 数据库 >sqlalchemy关系操作

sqlalchemy关系操作

时间:2024-03-10 18:45:06浏览次数:31  
标签:关系 __ sqlalchemy name Column session User 操作 id

一对多关系

models表创建

import datetime
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base, relationship
from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index

Base = declarative_base()  # Base 当成 models.Model


### 单表
class User(Base):
    __tablename__ = 'users'  # 表名
    # 写字段
    id = Column(Integer, primary_key=True, autoincrement=True)  # id 主键
    name = Column(String(32), index=True, nullable=False)  # name列,索引,不可为空
    email = Column(String(32), unique=True)
    # datetime.datetime.now不能加括号,加了括号,以后永远是当前时间
    ctime = Column(DateTime, default=datetime.datetime.now)
    extra = Column(Text)

    def __str__(self):
        return self.name

    def __repr__(self):
        return self.name


# 一对多 :一个兴趣被多个人喜欢  一个人只喜欢一个兴趣
class Hobby(Base):
    __tablename__ = 'hobby'
    id = Column(Integer, primary_key=True)
    caption = Column(String(50), default='篮球')

    def __str__(self):
        return self.caption

    def __repr__(self):
        return self.caption


class Person(Base):
    __tablename__ = 'person'
    id = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=True)
    # hobby指的是tablename而不是类名,uselist=False
    # 外键关联--》强外键--》物理外键
    hobby_id = Column(Integer, ForeignKey("hobby.id"))

    # 跟数据库无关,不会新增字段,只用于快速连表操作
    # 类名,backref用于反向查询
    hobby = relationship('Hobby', backref='pers')

    def __str__(self):
        return self.name

    def __repr__(self):
        return self.name

操作

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from models import Hobby, Person, User

engine = create_engine(
    "mysql+pymysql://root:[email protected]:3306/sqlalchemy02",
    max_overflow=0,  # 超过连接池大小外最多创建的连接
    pool_size=5,  # 连接池大小
    pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
    pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
)

Session = sessionmaker(bind=engine)
session = Session()

# 1  增加 Hobby
hobby = Hobby(caption='足球')
hobby1 = Hobby()
session.add_all([hobby, hobby1])
session.commit()

# 2 增加Person
p1 = Person(name='彭于晏', hobby_id=1)
p2 = Person(name='刘亦菲', hobby_id=2)
session.add_all([p1, p2])
session.commit()

# 3 简便方式增加person---》增加Person,直接新增Hobby
hobby1 = Hobby(caption='乒乓球')
p1 = Person(name='彭于晏', hobby=hobby1) # 前提是必须有relationship
session.add(p1)
session.commit()

# 4 基于对象的跨表查询---正向
per=session.query(Person).filter_by(name='彭于晏').first()
print(per)
# 正向
print(per.hobby.caption)

# 5 基于对象的跨表查询---正向
hobby=session.query(Hobby).filter_by(caption='篮球').first()
print(hobby)
# 反向--->拿到多条
print(hobby.pers)
print(hobby.pers[0].name)  # 列表套对象

多对多关系

models表创建

import datetime
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base, relationship
from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index

Base = declarative_base()  # Base 当成 models.Model


### 单表
class User(Base):
    __tablename__ = 'users'  # 表名
    # 写字段
    id = Column(Integer, primary_key=True, autoincrement=True)  # id 主键
    name = Column(String(32), index=True, nullable=False)  # name列,索引,不可为空
    email = Column(String(32), unique=True)
    # datetime.datetime.now不能加括号,加了括号,以后永远是当前时间
    ctime = Column(DateTime, default=datetime.datetime.now)
    extra = Column(Text)

    def __str__(self):
        return self.name

    def __repr__(self):
        return self.name


# 一对多 :一个兴趣被多个人喜欢  一个人只喜欢一个兴趣
class Hobby(Base):
    __tablename__ = 'hobby'
    id = Column(Integer, primary_key=True)
    caption = Column(String(50), default='篮球')

    def __str__(self):
        return self.caption

    def __repr__(self):
        return self.caption


class Person(Base):
    __tablename__ = 'person'
    id = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=True)
    # hobby指的是tablename而不是类名,uselist=False
    # 外键关联--》强外键--》物理外键
    hobby_id = Column(Integer, ForeignKey("hobby.id"))

    # 跟数据库无关,不会新增字段,只用于快速连表操作
    # 类名,backref用于反向查询
    hobby = relationship('Hobby', backref='pers')

    def __str__(self):
        return self.name

    def __repr__(self):
        return self.name


# 多对多
class Boy2Girl(Base):
    __tablename__ = 'boy2girl'
    id = Column(Integer, primary_key=True, autoincrement=True)
    girl_id = Column(Integer, ForeignKey('girl.id'))
    boy_id = Column(Integer, ForeignKey('boy.id'))
    # boy = relationship('Boy', backref='boy')


class Girl(Base):
    __tablename__ = 'girl'
    id = Column(Integer, primary_key=True)
    name = Column(String(64), unique=True, nullable=False)


class Boy(Base):
    __tablename__ = 'boy'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), unique=True, nullable=False)

    # 与生成表结构无关,仅用于查询方便,放在哪个单表中都可以--等同于manytomany
    girls = relationship('Girl', secondary='boy2girl', backref='boys')


if __name__ == '__main__':
    # 3.1 创建引擎
    engine = create_engine(
        "mysql+pymysql://root:[email protected]:3306/sqlalchemy02",
        max_overflow=0,  # 超过连接池大小外最多创建的连接
        pool_size=5,  # 连接池大小
        pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
        pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
    )
    # 3.2 把表模型同步到数据库中
    Base.metadata.create_all(engine)

    # 3.3 删除表
    # Base.metadata.drop_all(engine)

操作

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from models import Hobby, Person, User, Boy, Girl, Boy2Girl

engine = create_engine(
    "mysql+pymysql://root:[email protected]:3306/sqlalchemy02",
    max_overflow=0,  # 超过连接池大小外最多创建的连接
    pool_size=5,  # 连接池大小
    pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
    pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
)

Session = sessionmaker(bind=engine)
session = Session()

# 1  增加 Boy
boy = Boy(name='王小刚')
boy2 = Boy(name='王小明')
boy3 = Boy(name='王小勇')
session.add_all([boy,boy2,boy3])
session.commit()
# 2 增加Girl
girl = Girl(name='张小华')
girl2 = Girl(name='刘小红')
girl3 = Girl(name='李小丽')
session.add_all([girl3, girl2, girl])
session.commit()
# 3 增加Boy2Girl
obj1=Boy2Girl(boy_id=1,girl_id=1)
obj2=Boy2Girl(boy_id=1,girl_id=2)
obj3=Boy2Girl(boy_id=1,girl_id=3)
session.add_all([obj2, obj3, obj1])
session.commit()

# ------

# 3 简便方式增加

obj2=Girl(name='张亦菲')
obj3=Girl(name='李娜扎')
obj1=Boy(name='张小勇',girls=[obj2,obj3])

session.add(obj1)
session.commit()

# 4 基于对象的跨表查询---正向
boy=session.query(Boy).filter_by(name='张小勇').first()
print(boy.girls[0].name)


# 5 基于对象的跨表查询---反向
girl=session.query(Girl).filter_by(name='张亦菲').first()
print(girl.boys)

基本增删改查的使用

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session
from models import User, Person, Hobby, Boy, Girl, Boy2Girl
from sqlalchemy.sql import text

engine = create_engine("mysql+pymysql://root:[email protected]:3306/sqlalchemy02", max_overflow=0, pool_size=5)
Session = sessionmaker(bind=engine)
session = scoped_session(Session)

# 1 添加, add   add_all

# 2 删除
# 2.1 session.query(Users).filter_by(id=1).delete()
# 2.1 session.delete(对象)
user = session.query(User).filter_by(id=1).first()
session.delete(user)
session.commit()

# 3 修改
# 1 方式一:
session.query(Boy).filter_by(id=1).update({'name':'xxx'})
session.commit()

# 2 方式二  类名.属性名,作为要修改的key
session.query(Boy).filter_by(id=4).update({Boy.name:'xxx1'})
session.commit()


# # id为4的人的名字后+  _nb   类似于django的 F 查询

session.query(User).filter_by(id=2).update({'name':User.name+'_nb'},synchronize_session=False) # 字符串拼接
# session.query(User).filter_by(id=2).update({'id':User.id+6}, synchronize_session="evaluate") # 数字之间加
# session.commit()


# # 3 方式三:
# 对象.name='xxx'
#session.add(对象)
# boy=session.query(Boy).filter_by(id=1).first()
# boy.name='xxzzyy'
# session.add(boy) # 有id就是修改,没有就是新增
# session.commit()



### 4 查询---》基本查询
# 4.1 filter_by  写条件
# res=session.query(User).filter_by(name='lqz_nb',id=8).first()
# res=session.query(User).filter_by(name='lqz').all()  # 放在列表中 不是queryset对象



# 4.2 filter  写表达式
# res=session.query(User).filter(User.name=='lqz_nb').first()
# res=session.query(User).filter(User.id>=3).all()
# res=session.query(User).filter(User.name!='lqz').all()


# 4.3 只查表中某几个字段,并重命名
# select name as xx,age from user;
# res=session.query(User.name.label('xx'), User.email)

# select name,email from user;
# res=session.query(User.name, User.email).all()
# res=session.query(User)


# 4.4 条件可以使用text自己拼凑
# select * from user where id< 224 and name=lqz order by id
# res = session.query(User).filter(text("id<:value and name=:name")).params(value=224, name='lqz_nb').order_by(User.id).all()
# print(res)



## 4.5 直接原生sql
# SELECT * FROM users where name=lqz
# res = session.query(User).from_statement(text("SELECT * FROM users where name=:name")).params(name='lqz_nb').all()
res = session.query(User).from_statement(text("SELECT * FROM users where name=:name")).params(name='张三')
print(res)

标签:关系,__,sqlalchemy,name,Column,session,User,操作,id
From: https://www.cnblogs.com/wellplayed/p/18064555

相关文章

  • cache操作函数 --20240310
    Baremetal不讨论多级cache的情况下,裸驱两种关于dcache的操作:flush_dcache_all();//将cache里面的东西刷入内存invalidate_dcache_all();//将数据缓存中的所有内容无效化(invalidate)。该指令一般用于确保缓存中的数据与主内存中的数据同步flush_dcache_all()函数通常在嵌入......
  • 神州笔记本(HASEE) win11 操作系统自动进入休眠状态,唤醒后自动关机
    前几日在某东上购入神州笔记本(HASEE),用着本来还好,但是最近只要用到电源模式的问题,这个笔记本就是会无端进入到自动关机的状态。前文中也讨论过类似的问题:神州笔记本win11节能模式供电不足自动关机不过这次又有了新的问题,那就是在操作系统的电源模式下设置”闲置进入睡眠“......
  • PowerDesigner操作要点
    一、PowerDesigner解决name和code同步问题工具-常规选项-General Options-Dialog-NametoCodemirroring√去掉  二、PowerDesigner用反向工程导入sql生成新的数据模型1、文件-反向工程-Database 2、点击确定下一步 3、选择对应的SQL点击确定 4、结果如图所......
  • 计算机操作系统(第四版)- 汤小丹 - 课后习题答案
    计算机操作系统(第四版)汤小丹课后习题答案第一章1.设计现代OS的主要目标是什么?答: (1)有效性  (2)方便性  (3)可扩充性  (4)开放性2.OS的作用可表现在哪几个方面?答:(1)OS作为用户与计算机硬件系统之间的接口(2)OS作为计算机系统资源的管理者(3)OS......
  • 阿里云 同账号、同地域 ECS服务器,VPC对等连接具体设置操作(路由设置)
    阿里云ECS间内网通讯,在速度上有巨大优势。虽然阿里云文档资料比较全面,但是新手、尤其是是对网络不太熟悉的人设置起来还是有点难度的。又的朋友可能会出现:AECS服务器VPC网段设置为:172.17.0.0/16,BECS服务器VPC网段设置为:172.17.30.0/24这种情况时,按照阿里云资料咋操作也是不会成......
  • MYSQL学习笔记12: DCL数据控制语言(用户操作)
    DCL数据控制语言查询用户#用户信息保存在数据库mysql的user表中usemysql;select*fromuser;创建用户createuser'用户名'@'主机名'identifiedby'密码';在主机localhost创建一个新用户createuser'hikari39'@'localhost'identifiedby'123456......
  • MYSQL学习笔记13: DCL权限控制(用户权限操作)
    DCL权限控制查询权限showgrantsfor'用户名'@'主机名';查询某个用户的权限showgrantsfor'hikaru39'@'localhost';授予权限grant权限列表on数据库名.表名to'用户名'@'主机名';授予某个用户权限#all,给予数据库itcast中所有表的权限grantallonitcast......
  • SFTP 操作Linux远程服务器的文件
    SFTP操作Linux远程服务器的文件1.列出目录下的文件2.删除/home/username/test.txt3.上传文件到Linux服务器4.下载Linux服务器文件到本地5.下载Linux服务器文件为byte[]添加依赖<dependency><groupId>com.jcraft</groupId><artifactId>......
  • python 操作 minio
    环境安装pipinstall-Uminio示例代码importosfromminioimportMiniofromloguruimportloggerfromdatetimeimporttimedeltaclassClient:'''endpoint:ip:portaccess_key:yourusernamesecret_key:yourpasswordsecur......
  • (笔记)Vivado操作之时序约束介绍
     一、前言      任何一个FPGA工程都需要设置相关的时序约束,下面将介绍Vivado中如何进行时序约束操作以及各种约束的使用方法。 二、时序约束界面        在一个工程运行到IMPLEMENTATION后,进入到左侧的FlowNavigator窗口,点击IMPLEMENTION下的EditConstraint......