##sqlalchemymysql
#一、SQLAlchemy介紹 SQLAlchemy是Python編程語言下的一款ORM(對象關係映射)框架,該框架創建在數據庫API之上,使用關係對象映射進行數據庫操做,簡言之即是:將對象轉換成SQL,而後使用數據API執行SQL並獲取執行結果。 #二、安裝 pip3 install sqlalchemy #三、建立表結構 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine ### 鏈接MySQL engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/db3?charset=utf8", max_overflow=5) Base = declarative_base() ''' create table users( id int auto_increment primary key, name varchar(32) not null default '', extra varchar(32) not null default '' ) ''' ''' Usertype id title xxoo 1 普通用戶 row.xxoo : 多條記錄對象---反向查詢 ''' class UserType(Base): __tablename__ = 'usertype' ### 表名 id = Column(Integer, autoincrement=True, primary_key=True) title = Column(String(32), nullable=False, server_default='') ''' users id name extra type_id 1 zekai nb 1 usertype = releationship('Usertype') row.usertype-----正向查詢 ''' class Users(Base): __tablename__ = 'users' id = Column(Integer, autoincrement=True, primary_key=True) name = Column(String(32), nullable=False, server_default='') extra = Column(String(32), nullable=False, server_default='') #創建外鍵,經過類名點屬性,不須要單引號 type_id=Column(Integer,ForeignKey(UserType.id)) #創建外鍵,經過對象名點屬性,須要單引號 #type_id = Column(Integer, ForeignKey('usertype.id')) usertype = relationship('UserType', backref='xxoo') __table_args__ = ( # UniqueConstraint('id', 'name', name='uix_id_name'), ### 聯合惟一索引 # Index('ix_name_extra', 'name', 'extra'), ### 組合索引 ) def drop_db(): Base.metadata.drop_all(engine) def create_db(): ## 會將當前執行文件中全部繼承自Base類的類,生成表 Base.metadata.create_all(engine) # drop_db() #要從新生成表或者要修改表 要先drop掉 create_db() ###四、操做表中的數據 Session = sessionmaker(bind=engine) session = Session() ### 增長一條數據,obj爲UserType類的一個對象,即對應的時一行數據 obj = UserType(title='普通用戶') session.add(obj) session.commit() ### 添加多條數據---要提交 session.add_all([ UserType(title='VIP用戶'), UserType(title='VIP中P用戶'), UserType(title='SVIP用戶'), UserType(title='黑金用戶') ]) session.commit() ### 查詢 # ### 查詢所有 返回的是一個列表, 列表中套對象,末尾不加all()打印的時sql語句,sqlalchemy自動幫咱們轉化爲sql res = session.query(UserType).all() for row in res: print(row.id, row.name) # ### 查詢一條數據 res = session.query(UserType).first() print(res) ### where條件 #filter內傳的是表達式,逗號分隔,默認爲and, res = session.query(UserType).filter(UserType.title=='VIP用戶', UserType.id==2).all() #獲得一個對象在列表中,能夠for循環遍歷 for row in res: print(row.id, row.name) #或者直接索引點屬性 print(res[0].name, res[0].id) res = session.query(UserType).filter_by(name='VIP用戶').all() print(res) ### 刪除:---要提交 session.query(UserType).filter(UserType.id>3).delete()
session.query(UserType).filter(UserType.id.in_([3,4])).delete(synchronize_session=False)
session.commit() ## 修改---要提交
#修改一條 session.query(UserType).filter(UserType.id == 3).update({"title" : "SVIP用戶"})
#修改多條
session.query(UserType).filter(UserType.id.in_([3,4])).update({"title" : "SVIP用戶"},synchronize_session=False)
session.commit() ### MySQL 高級查詢操做 #### 通配符 分組 分頁 排序 between and in not in ### 一、between ... and ... res = session.query(UserType).filter(UserType.id.between(1,3)).all() for row in res: print(row.id, row.title) ###二、 in 操做 bool_ res = session.query(UserType).filter(UserType.id.in_([1,3,4])).all() print(res) ### 三、非 not in #~表明取反,轉換成sql就是關鍵字not select * from Usertype res = session.query(UserType).filter(~UserType.id.in_([1,3,4])).all() for row in res: print(row.id, row.title) res = session.query(UserType.title).filter(~UserType.id.in_([1,3,4])).all() for row in res: print( row.title) #四、與,或 from sqlalchemy import and_, or_ res=session.query(UserType).filter(and_(UserType.id > 2,UserType.id <4)).all() for row in res: print(row.id,row.title) res=session.query(UserType).filter(or_(UserType.id > 2,UserType.title=='SVIP用戶')).all() for row in res: print(row.id,row.title) ###五、 通配符 res=session.query(UserType).filter(UserType.title.like('%用戶')).all() for row in res: print(row.id,row.title) ###六、limit res=session.query(UserType)[1:3] for row in res: print(row.id,row.title) ###七、排序 res=session.query(Users).order_by(Users.name.desc(),Users.type_id.asc()) for row in res: print(row.id,row.title) ###八、分組 過濾 先手動在命令行添加數據 insert into users(name,extra,type_id) values('zekai','nb',5),('egon','sb',3),('lxx','bb',1),('owen','xx',3),('jerry','xn',1); from sqlalchemy import func res = session.query( Users.type_id, func.max(Users.id), func.min(Users.id) ).group_by(Users.type_id).all() print(res) ret = session.query( func.max(Users.id), func.min(Users.id)).group_by(Users.type_id).having(func.min(Users.id) >2).all() ###九、子查詢 session.query(UserType).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all() ### 十、鏈接 :默認爲內鏈接,指定參數isouter=True爲left join res= session.query(Users,UserType).join(UserType) print(res) 打印默認爲內鏈接sql語句 res= session.query(Users,UserType).join(UserType,isouter=True) #print(res) 指定參數爲左鏈接 ###十一、正向、反向查詢思想-----usertype = relationship('UserType', backref='xxoo')放在關聯表裏面(*****************************重點******) ###11-1. 查詢某一個用戶的用戶類型 ### 第一種方法:沒使用正向查詢方法 res = session.query(Users,UserType).join(UserType, isouter=True).all() # print(res) for row in res: print(row[0].id, row[0].name, row[1].title) ### 第二種方法:正向查詢思想:隱藏屬性,直接點可使用 res = session.query(Users).all() for row in res: print(row.id, row.name, row.extra, row.usertype.title) ###11-2. 某一個類型下面的用戶 ### 第一種方法:沒使用反向查詢思想 res = session.query(UserType).all() for row in res: print(row.id, row.title, session.query(Users).filter(Users.type_id == row.id).all() ) ### 第二種方法:使用反向查詢思想(這裏說明一下Users表中type_id字段關聯UserType表中id字段,如今直接在UserType找屬性,就能夠理解爲反向查找) res = session.query(UserType).all() for row in res: print(row.id, row.title, row.xxoo) session.commit() session.close()
##架構與流程圖sql