Python Day 43 Mysql基礎語法(五)sqlalchemy、建立表、增刪改查、高級查詢操做、正向反向查詢

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

相關文章
相關標籤/搜索