天天看點

python的ORM技術:使用sqlalchemy操作mysql資料庫

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from sqlalchemy import Column, String, create_engine, Integer, Date, Float, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base

#######################################################################################################
##############初始化資料庫連接配接,傳回session
#######################################################################################################
def get_session():
    # 初始化資料庫連接配接 # '資料庫類型+資料庫驅動名稱://使用者名:密碼@機器位址:端口号/資料庫名'
    engine = create_engine('mysql+pymysql://root:[email protected]:9000/mysqldb?charset=utf8')
    DBSession = sessionmaker(bind=engine)  # 建立DBSession類型
    session = DBSession()
    return session



#######################################################################################################
##############表格對象建立
#######################################################################################################
###建立對象的基類:
Base = declarative_base()

###定義Asset表對象
class Asset(Base):
    # 表的名字:
    __tablename__ = 'hr_asset'

    # 表的結構:
    id = Column(Integer, primary_key=True)
    assetnum = Column(String(50))
    assetname = Column(String(50))
    assetmodel = Column(String(50))
    assettype = Column(Integer)
    assetstate =  Column(Integer)
    usepersonid = Column(Integer, ForeignKey("hr_user.id"))
    userperson = relationship("User",backref="asset", uselist=False)


####定義User表對象
class User(Base):
    # 表的名字:
    __tablename__ = 'hr_user'

    # 表的結構:
    id = Column(Integer, primary_key=True)
    username = Column(String(50))
    age =  Column(Integer)
    degree = Column(String(50))



#######################################################################################################
##############資料操作模闆
########################################################################################################
####INSERT插入資料  模闆
if __name__ == "__main__":
    try:
      # 建立session對象
      session1 = get_session()
      # 建立新表格對象
      new_user = User(username='龍九', age=33, degree="大學")
      # 添加到session
      session1 .add(new_user)
      # 送出即儲存到資料庫
      session1 .commit()
      # 得到新資料id  
      the_id=new_user.id    
      # 關閉session
      session1 .close()
    except:
        pass



####DELETE删除資料  模闆
if __name__ == "__main__":
    try:
        session2 = get_session()
        session2.query(User).filter(User.id == '3').delete()
        session2.commit()
        session2.close()
    except:
        pass

####UPDATE更新資料  模闆
if __name__ == "__main__":    #模闆1
    try:
        session3 = get_session()
        session3.query(User).filter(User.id == '2').update({User.degree: '高中'}, synchronize_session=False)
        session3.commit()
        session3.close()
    except:
        pass




if __name__ == "__main__":   #模闆2   
    try:
        session3 = get_session()
        the_user = session3.query(User).get(2)  #參數為主鍵id
        the_user.username ="小王"
        the_user.age= 40
        the_user.degree ="博士"
        session3.commit()
        session3.close()
    except:
        pass


####SELECT查詢資料之單條資料 模闆
if __name__ == "__main__":
    try:
        session4 = get_session()
        user = session4.query(User).filter(User.id == 3).one()    #注:這裡用one()
        print('type:', type(user))
        print('name:', user.username)
        session4.close()
    except:
        pass



####SELECT查詢資料之多條資料 模闆
if __name__ == "__main__":
    try:
        session5 = get_session()
        users = session5.query(User).filter(User.id > 0).all()    #注:這裡用all()
        for i in range(len(users)):
            print(users[i].id)
            print(users[i].username)
        session5.close()
    except:
        pass

####SELECT查詢資料之連表查詢 模闆
if __name__ == "__main__":
    try:
        session6 = get_session()
        assets = session6.query(Asset).join(User).filter(User.id > 0).all()
        for i in range(len(assets)):
            pass
        session6.close()
    except:
        pass