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()
原文地址:https://www.cnblogs.com/yuanjia8888/p/13335358.html