首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Pylons 1.0 整合 MongoDB 實戰:Ming ORM 設定與模型定義完整指南

     編輯:更多程式設計知識

Pylons 1.0 釋出標誌著 API 穩定,適合正式產品開發。其核心優勢在於高度可定制:不重造輪子,而是整合現有 Python 生態。Model 層預設支援 SQLAlchemy,若要引入 MongoDB,輕量級 ORM Ming 是官方推薦選擇(源自 SourceForge 以 TurboGears + MongoDB 重構的副產品)。本文以實戰專案結構示範從設定檔到模型定義的完整整合流程。

專案結構與關鍵檔案


PROJECT/
├── model/
│   └── __init__.py        # 模型定義與 Ming 初始化
├── config/
│   └── environment.py     # 應用環境載入,含 DB 引擎建立
├── websetup.py            # 部署時初始化資料
└── development.ini        # 設定檔

1. 模型層定義 (model/__init__.py)

from ming import Session, schema
from ming.orm import MappedClass, FieldProperty, ForeignIdProperty, RelationProperty
from ming.orm import ThreadLocalORMSession

session = None  # 全域 Session 物件,稍後由 init_model 注入

def init_single_model(model_class):
    model_class.__mongometa__.session = session

class Page(MappedClass):
    class __mongometa__:
        session = session
        name = 'pages'  # MongoDB collection 名稱

    _id = FieldProperty(schema.ObjectId)
    title = FieldProperty(str)
    content = FieldProperty(str)

def init_model(engine):
    global session
    session = ThreadLocalORMSession(doc_session=Session(engine))
    init_single_model(Page)
    MappedClass.compile_all()  # 編譯所有映射類別

關鍵點:

  • ThreadLocalORMSession 確保請求級別的 Session 隔離,適合 Web 環境。
  • MappedClass.compile_all() 必須在所有模型定義完成後呼叫一次。
  • 欄位型別對應 MongoDB 原生型別 (ObjectId, str 等)。

2. 環境初始化 (config/environment.py)

from ..model import init_model
from ming.datastore import DataStore

def load_environment(global_conf, app_conf):
    # ... 既有 Mako 模板設定 ...

    # 建立 MongoDB 引擎並初始化模型
    init_model(DataStore(config['database.uri']))

    return config

3. 設定檔 (development.ini)

[app:main]
database.uri = mongodb://localhost:27017/test

URI 格式支援認證、Replica Set 等進階選項,參考 MongoDB 連接字串規格。

4. 部署時種子資料 (websetup.py)


def setup_app(command, conf, vars):
    if not pylons.test.pylonsapp:
        load_environment(conf.global_conf, conf.local_conf)
        log.info("Adding demo data.")
        page = model.Page(title='demo', content='This is for demo.')
        model.session.flush()  # 同步寫入 MongoDB
        log.info("Successfully set up.")

替代方案與生態選擇

Ming API 設計參考 SQLAlchemy,上手快。若專案需求不同,亦可替換為:

  • MongoKit:較輕量,支援結構驗證。
  • Motor:非同步驅動,適配 Tornado/asyncio。
  • PyMongo 直操作:無 ORM 開銷,適合高效能/簡單查詢場景。

遷移至 Pyramid 的提示

Pylons 現已併入 Pyramid,新專案建議直接使用 Pyramid + pyramid_mongodb 或原生 Motor。既有 Pylons 專案可參考官方遷移指南逐步轉型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved