Jak to uděláte opakovaně použitelné komponenty s baňky-SQLAlchemy?

hlasů
5

Řekněme, že mám část svého baňky aplikace, které chci vytáhnout a používat v několika různých projektů. Má SQLAlchemy modely pomocí Flask-SQLAlchemy, stejně jako názory a šablon. Mohu dostat app.route malíři pomocí modulu, ale jak mohu zvládnout db objekt SQLAlchemy?

Vzhledem k tomu, moje složka musí být oddělené, nemůžu jen import objektu db. Ale nemyslím si, že bych měl dvakrát vytvořit objekt db. Jak bych mix jeho metadata s metadaty ve zbytku projektu?

Položena 25/04/2011 v 08:03
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
3

Zpočátku je třeba sdílet metadataa nepoužívají baňka-sqlalchemy db.Model jako základ pro vás znovu použitelný app.

Na druhou nutné znovu všechny třídy s výsuvnou jim nové základny z baňky-sqlalchemy na nosných signálů, zkratek a dalších věcí.

Integrace bází (to může být kočárek):

def integrate_models(cls, nbase):
        new_bases = list(cls.__bases__) + [nbase]
        new_dict = dict(cls.__dict__)
        new_dict.update(dict(nbase.__dict__))
        return type.__new__(cls.__class__, cls.__name__, tuple(new_bases), new_dict)

aplikace Příklad Baňka s sqlalchemy rozšíření:

# -*- coding: utf-8 -*-
from flask import Flask
from flaskext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.username

if __name__ == '__main__':
        from some_model_base import init_metadata
        init_metadata(db.Model.metadata)

        from some_model import SomeClass

        SomeClass = integrate_models(SomeClass, db.Model)

        db.create_all()

        print SomeClass.query.all()

Kde some_model_base.py:

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

def init_metadata(metadata):
    Base.metadata = metadata

A some_model.py:

from sqlalchemy import Column, Integer, String
from some_model_base import Base

class SomeClass(Base):
    __tablename__ = 'some_table'
    id = Column(Integer, primary_key=True)
    name =  Column(String(50))

V testované pouze db.create_all a SomeClass.query zástupce tohoto příkladu.

Omlouvám se za mou špatnou angličtinu.

Odpovězeno 26/04/2011 v 14:20
zdroj uživatelem

hlasů
1

Měli byste použít flask.current_app, je to proxy objekt pro přístup k aktuální aplikaci, a to je to, co se používá v některých rozšíření. Takže váš kód bude vypadat nějak takto:

from flask import current_app
from flaskext.sqlalchemy import SQLAlchemy

db = SQLAlchemy(current_app)

a pak použít dbobjekt, jako byste obvykle dělají. Ale nejsem si jistý, jestli by to fungovat, pokud uživatel používá svůj modul a také zapotřebí použít flaskext.sqlalchemy, možná by bylo v rozporu, já bych navrhnout, aby tento test, abyste se ujistili, váš modul bude 100% kompatibilní s flaskaplikací.

Odpovězeno 15/08/2011 v 13:06
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more