zoukankan      html  css  js  c++  java
  • flask-sqlalchemy的一对多、 一对一的 relationship的属性backref的使用

    #encoding: utf-8

    from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,Date,DateTime,Time,String,Text,func,and_,or_,ForeignKey
    from sqlalchemy.dialects.mysql import LONGTEXT
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker,relationship,backref
    # 在Python3中才有这个enum模块,在python2中没有
    import enum
    from datetime import datetime
    import random

    HOSTNAME = '127.0.0.1'
    PORT = '3306'
    DATABASE = 'first_sqlalchemy'
    USERNAME = 'root'
    PASSWORD = '123456'

    # dialect+driver://username:password@host:port/database
    DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)

    engine = create_engine(DB_URI)

    Base = declarative_base(engine)

    session = sessionmaker(engine)()

    # 父表 / 从表
    # user/article

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


    def __repr__(self):
    return "<User(username:%s)>" % self.username

    # 上面的user是用户表、下面的UserExtend表是用户表的一些 不常用字段、比如学校、哪里人、这些字段、为了让每一次数据库读取的时候省时间、把他单独拿出来写一个UserExtend,(User和UserExtend是一对一对应的uselist=False)
    class UserExtend(Base):
    __tablename__ = 'user_extend'
    id = Column(Integer, primary_key=True, autoincrement=True)
    school = Column(String(50))
    uid = Column(Integer,ForeignKey("user.id"))

    # (重点)uselist 默认是一个list 这样他默认就是一对多、 写成uselist=False就只能去一一对应
    user = relationship("User",backref = backref("extend", uselist=False))

    #添加一个用户



    class Article(Base):
    __tablename__ = 'article'
    id = Column(Integer,primary_key=True,autoincrement=True)
    title = Column(String(50),nullable=False)
    content = Column(Text,nullable=False)
    uid = Column(Integer,ForeignKey("user.id"))

    author = relationship("User",backref="articles")

    def __repr__(self):
    return "<Article(title:%s,content:%s)>" % (self.title,self.content)

    Base.metadata.drop_all()
    Base.metadata.create_all()



    # 一对多添加实例 70-80行

    # #添加一个用户
    # user = User(username='小明')
    #
    # #添加两个文章 多个文章
    # article1 = Article(title = "xxxxxxxxxx",content = "222")
    # article2 = Article(title = "eeeeeeee",content = "3333")
    #
    # #把文章的作者添加成小明 从一的一方添加文章
    # user.articles.append(article1)
    # user.articles.append(article2)
    # session.add(user)
    # session.commit()
    #
    # #一对多添加 从多的一方进行添加
    # u1 = User(username = "书垒")
    # article3 = Article(title = "aaaaaaaa",content = "*9999")
    # article3.author = u1
    # session.add(article3)
    # session.commit()


    # 这样就实现了 一对一情况下的relationship的添加,主要要写上 relationship 的属性uselist=False
    user = User(username='哇咔咔')
    extend = UserExtend(school = "人民大学")
    user.extend = extend

    session.add(user)
    session.commit()
  • 相关阅读:
    Python学习笔记(2)
    Python学习笔记(1)
    2020年5月记于博茨瓦纳
    20145208 蔡野 《网络对抗》免考项目 MSF学习
    20145208 蔡野 《网络对抗》Exp9 web安全基础实践
    20145208 蔡野 《网络对抗》Exp8 Web基础
    20145208 蔡野 《网络对抗》Exp7 网络欺诈技术防范
    20145122 《Java程序设计》课程总结
    20145122《 Java网络编程》实验五实验报告
    20145122 《Java程序设计》第十周学习总结
  • 原文地址:https://www.cnblogs.com/yuanjia8888/p/13335358.html
Copyright © 2011-2022 走看看