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()
  • 相关阅读:
    部署方法
    MIME
    设置下载文件位置
    访问端口
    什么是Linq表达式?什么是Lambda表达式?
    彻底理解js中this的指向,不必硬背。
    获取checkbox状态
    checkbox复选框,如何让其勾选时触发一个事件,取消勾选时不触发
    leetcode — reverse-nodes-in-k-group
    leetcode — swap-nodes-in-pairs
  • 原文地址:https://www.cnblogs.com/yuanjia8888/p/13335358.html
Copyright © 2011-2022 走看看