• sqlalchemy orm的cascade的参数


    #encoding: utf-8
    
    from sqlalchemy import create_engine,Column,Integer,String,Float,func,and_,or_,Text,
        ForeignKey
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker,relationship,backref
    from random import randint
    
    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=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
    
    engine = create_engine(DB_URI)
    
    Base = declarative_base(engine)
    
    # Session = sessionmaker(engine)
    # session = Session()
    
    session = sessionmaker(engine)() #Session(**local_kw)
    
    
    class User(Base):
        __tablename__ = 'user'
        id = Column(Integer,primary_key=True,autoincrement=True)
        username = Column(String(50),nullable=False,unique=True)
    
    
    class Article(Base):
        __tablename__ = 'article'
        id = Column(Integer,primary_key=True,autoincrement=True)
        article_name = Column(String(50),nullable=False)
        uid = Column(Integer,ForeignKey('user.id'))
        author = relationship('User',backref='articles',cascade='save-update,delete')#其实这里还有默认字段cascade
    
        #cascade的属性,只能当前字段上,这里还有另一种写法,两个关联字段都设置
        # author = relationship('User', backref=backref('articles',cascade='save-update,delete'), cascade='save-update,delete')
    
        # cascade=save-update:默认选项,在添加一条数据的时候,会把其它和它相关联的数据都添加到数据中,
        #这就是 cascade = save-update的作用。
        #merge:默认选项。当使用session.merge,合并一个对象的时候,会将使用了relationship相关联的对象也进行merge操作。
        #expunge:移除操作的时候,会将相关联的对象也进行移除。这个操作只是从session中移除,并不会真正的从数据库中删除。
    #增加数据
    
    def init_db():
        #清空数据库,除多对多关系外
        Base.metadata.drop_all()
        #把数据映射到数据中
        Base.metadata.create_all()
        user = User(username='辰东')
        article = Article(article_name='遮天')
        article1 = Article(article_name='圣墟')
        article.author = user
        article1.author = user
        session.add_all([article, article1])
        session.commit()
    
    #cascade = delete ,relationship关联的数据删除,只要有关联的数据都删除
    
    def operation():
        #获取article的对象,这个对象关联(article.author=user)也就是user=session.query(User).first()的对象
        article = session.query(Article).first()
        session.delete(article)#这里删除article对象,由于cascde=delete这个属性,relationship关联的user对象也会随之删除
    
        # session.merge(article)相当字典的update操作,有就替换掉,没有就合拼
        #session.expunge(article)只会将对象从session中删除,不会从数据库中删除,
        #区别session.delete(article)
        session.commit()
    
    
    
    
    if __name__ == '__main__':
        # init_db()
        operation()
  • 相关阅读:
    整数转换成字符
    html总结(一)
    ssh服务
    原码反码补码图形化注意
    关于副本机制
    win8设置自动关机
    python制作的翻译器基于爬取百度翻译【笔记思路】
    python多线程扫描爆破网站服务器思路【笔记】
    用python实现多线程爬取影视网站全部视频方法【笔记】
    利用Python3的requests和re库爬取猫眼电影笔记
  • 原文地址:https://www.cnblogs.com/wuheng-123/p/9710829.html
Copyright © 2020-2023  润新知