老师对于下面这段代码,有一处我还能弄明白'
其中的author = relationship("User",backref=backref("comments")),怎么有时候又写成author = relationship("User",backref="comments"),“backref=”后面加backref的作用是?什么时候加呢?
from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,\
Date,DateTime,Time,String,Text,func,or_,and_,ForeignKey,Table
from sqlalchemy.dialects.mysql import LONGTEXT
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,relationship,backref
import random
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'first_sqlalchemy'
USERNAME = 'root'
PASSWORD = 'root'
DB_URI ="mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)()
class User(Base):
__tablename__ = 'user'
id = Column(Integer,primary_key=True,autoincrement=True)
uname = Column(String(50),nullable=False)
# articles =relationship("Article",cascade="save-update,delete") #放入Article中去优化
class Article(Base):
__tablename__ = 'article'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50), nullable=False)
uid = Column(Integer,ForeignKey("user.id"))
# author = relationship("User",backref="articles") #cascade默认为save-update
# author = relationship("User",backref="articles",cascade="")
# author = relationship("User",backref="articles",cascade="save-update") #明文指定 cascade的值
# author = relationship("User",cascade="save-update,delete")
author = relationship("User", backref = backref("articles",cascade="save-update,delete"),cascade="save-update,delete") #双向关系优化写法
class Comment(Base):
__tablename__ = 'comment'
id = Column(Integer, primary_key=True, autoincrement=True)
content = Column(Text,nullable=False)
uid = Column(Integer,ForeignKey("user.id"))
# 优化写法
author = relationship("User",backref=backref("comments"))
def add_data():
Base.metadata.drop_all()
Base.metadata.create_all()
user = User(uname="momo")
article = Article(title="华为5G")
article.author = user
session.add(article)
session.commit()
comment = Comment(content='你少说风凉话')
comment.author = user
session.add(comment)
session.commit()
def oper_data():
#relationship里边的cascade 可通过Article影响User
# article = session.query(Article).first()
# session.delete(article)
# session.commit()
# 反过来通过User也能影响Article
user = session.query(User).first()
session.delete(user)
session.commit()
#总结1:relationship里边的cascade 可通过Article影响User,反过来通过User也能影响Article
#总结2:relationship里边的cascade 只会影响当前类User中relationship的模型Article,不会影响别的模型Comment
if __name__ == '__main__':
# add_data()
oper_data()
#ORM层面的relationship方法中cascade使用1