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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM