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

一心獅發表於2018-08-13
#!/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:root@10.10.10.11: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


相關文章