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