• 三十六:数据库之SQLAlchemy外建之一对一关系


    relationship()的uselist参数默认为True,即一对多,如果要一对一,则需让uselist=False

    准备工作

    from sqlalchemy import create_engine, Column, Integer, String, Float, Text, ForeignKey
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker, relationship

    # 数据库信息
    host = '127.0.0.1'
    port = '3306'
    database = 'db_to_sqlalchemy'
    username = 'root'
    password = '123456'

    # 数据库类型+连接数据库的插件,这里使用的pymysql
    DB_URI = f'mysql+pymysql://{username}:{password}@{host}:{port}/{database}'

    engine = create_engine(DB_URI) # 创建引擎
    Base = declarative_base(engine) # 使用declarative_base创建基类
    session = sessionmaker(engine)()

    模型关系

    class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True, autoincrement=True)
    username = Column(String(50), nullable=Float)

    u_info = relationship('UserInfo', uselist=False) # 关闭一对多关系,即一对一

    def __repr__(self):
    return f'User(username: {self.username})'


    class UserInfo(Base):
    __tablename__ = 'user_info'
    id = Column(Integer, primary_key=True, autoincrement=True)
    school = Column(String(50))
    uid = Column(Integer, ForeignKey('user.id'))

    user = relationship('User')

    Base.metadata.drop_all()  # 删除所有表
    Base.metadata.create_all() # 创建表

    user = User(username='abc')
    info1 = UserInfo(school='xxxxx')
    user.u_info = info1

    session.add(user)
    session.commit()

    若采用一对多的关系则会报错

    优化

  • 相关阅读:
    寒假学习日报29
    寒假学习日报28
    保证多个线程顺序执行
    switchHost本地映射
    Redis 淘汰策略解读
    再过半小时,你就能明白kafka的工作原理了
    Zookeeper用来做什么的,有几种类型的节点
    类加载过程
    REDIS缓存穿透,缓存击穿,缓存雪崩原因+解决方案
    数据库的锁机制及原理
  • 原文地址:https://www.cnblogs.com/zhongyehai/p/11815770.html
Copyright © 2020-2023  润新知