python下SQLAlchemy的使用

  SQLAlchemy是python中orm常用的框架。支持各種主流的數據庫,如SQLite、MySQL、Postgres、Oracle、MS-SQL、SQLServer 和 Firebird。

  在安裝好SQLAlchemy之後導入相關的模塊,如下是一些常用的模塊,也可以根據項目的實際需要在添加。

  from sqlalchemy import Column, String, create_engine #導入包
  from sqlalchemy.orm import sessionmaker
  from sqlalchemy.ext.declarative import declarative_base

  定義數據模型,通常創建SqlTable.py(文件名稱自定義就好)

# coding: utf-8
from sqlalchemy import Column, Integer, String, Float, BigInteger, Unicode, Text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import ForeignKey, Sequence
from sqlalchemy.orm import relationship
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class UserInfo(Base):#所有類繼承自Base
    __tablename__ = 'UserInfo'#表的名字
  #表的字段定義
primaryId = Column(Integer,Sequence('user'),primary_key=True) username
= Column(Unicode(50)) password = Column(Unicode(50)) #以下爲非必須方法,允許通過字典,對數據模型進行實例化 def __init__(self, user_dict): for key in user_dict: setattr(self, key, user_dict[key]) def update(self, info_dict): for key in info_dict: setattr(self, key, info_dict[key])

 

  定義數據模型,數據模型中可以定義Id自增序列,在引用模塊時添加Sequence,並且指定序列名稱,如果多個數據模型共用一個序列,會導致非連續自增。
  創建文件SqlManager.py,作用類似於C#中常見的SqlHellper,將SQLAlchemy的常用功能進行封裝。

# coding: utf-8
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import SqlTable
from SqlTable import Base
import utils #自定義模塊
from sqlalchemy import and_
from sqlalchemy import desc
from sqlalchemy import func
 
config = utils.load_config() #自定義加載配置文件方法 
engine = None
Session = None 

class GetSession(object):
    def __init__(self): 
        self.session = Session()

     def __enter__(self): 
        return self.session 

    def __exit__(self, exception_type, exception_value, exc_traceback): 
        if exception_type is not None: 
            self.session.rollback() 
            log.error("session error:{}".format(traceback.format_tb(exc_traceback)))
        self.session.close()

class SqlManager(objecet): 
    def __init__(self): 
        self._rlock = threading.RLock()
        global Session 
        global engine 
        engine = create_engine( "mysql+pymysql://{user}:{pwd}@127.0.0.1:3306/{dbname}?charset=utf8".format( 
user=config["db_user"], pwd=config["db_password"], dbname=config["dbname"])) Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) #以下爲非必須舉例,根據項目需求寫增刪改查,也可以通過泛型的思想編寫一些 def add_user(self,username,pwd): with self._rlock: with GetSession() as session: user= User( name=username,password=pwd) session.add(user) session.commit()
def add(self,tabname,dictlist):#注意:如果參數爲字典列表,數據模型中要有相應的通過字典初始化的方法 with self._rlock: table = getattr(SqlTable,tabname) engine.execute(table.__table__.insert(),dictlist) def update(self,tabname,dict): with self._rlock: with GetSession as session: table = getattr(SqlTable,tabname) result=session.query(table),filter(table.id=dict["id"])      if len(result)==0: new_info=table(dict) session.add(new_info) else: update_info=result[0] update_info.update(dict)#數據模型中需要有update方法 session.commit()

 

  初始化數據連接 ,數據連接的基本格式爲:數據庫類型+數據庫驅動名稱://用戶名:口令@機器地址:端口號/數據庫名
  如果提示引擎創建出錯,可以嘗試去掉數據庫驅動名稱,試運行等系統提示需要哪個模塊,下載安裝即可。
  數據連接可以根據採用的數據庫類型去拼接,有些數據庫的驅動需要另外安裝。創建方法如下:
  engine = create_engine('mysql+pymysql://root:password@localhost:3306/test?charset=utf8')
  engine = create_engine('sqlite:///' + unicode(config["db_path"], "utf-8")) #sqlite數據庫可以直接指向地址,相對路徑或絕對路徑。

  初始化數據庫連接且數據模型創建完之後,需要在數據庫中創建對應的表(有些類型的數據庫需要手動創建),這一步可以交給SQLAlchemy來,代碼如下:Base.metadata.create_all(engine) 。這行代碼如果放在定義數據模型的最下邊,會在import時運行,不建議放在sqltable.py中。上邊代碼放在了SqlManager類初始化的時候執行,避免import時加載的不受控制,具體原因會在正文後詳述。
  

  創建數據庫會話類,這個類的實例可以當成數據庫連接,同時還記錄了一些的查詢的數據並且決定什麼時候纔會執行數據操作。
  Session = sessionmaker(bind=engine) #創建數據庫會話類
  數據庫會話類的使用:
  # 創建session對象:
  session = Session()
  # 創建新User對象:
  new_user = User(id='5', name='Bob')
  # 添加到session:
  session.add(new_user)
  # 提交即保存到數據庫:
  session.commit()
  # 關閉session:
  session.close()
  或者使用with增加代碼的健壯性:
  new_user = User(id='5', name='Bob')
  with GetSession() as session:
    session.add(new_user)
    session.commit()
  基本操作到此可以應付日常工作,其他的進階技能可以參考:http://blog.csdn.net/zd0303/article/details/50261347

關於with的使用:GetSession(),如上方法使用中的session是一個類對象,而且類中必須實現__enter__() 和__exit__()方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章