Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlalchemy 如何使用Alchemy制作可重用组件?_Sqlalchemy_Code Reuse_Flask_Flask Sqlalchemy - Fatal编程技术网

Sqlalchemy 如何使用Alchemy制作可重用组件?

Sqlalchemy 如何使用Alchemy制作可重用组件?,sqlalchemy,code-reuse,flask,flask-sqlalchemy,Sqlalchemy,Code Reuse,Flask,Flask Sqlalchemy,假设我有一个烧瓶应用程序的一部分,我想在多个不同的项目中使用它。它有使用SQLAlchemy的SQLAlchemy模型,以及视图和模板。我可以通过使用模块获得app.route decorators,但是如何处理SQLAlchemy db对象呢 因为我的组件需要分开,所以我不能只导入db对象。但是我不认为我应该创建db对象两次。如何将其元数据与项目其余部分中的元数据混合?首先,您必须共享元数据,并且不要将flask sqlalchemy db.Model用作可重用应用程序的基础 第二步,您必须重

假设我有一个烧瓶应用程序的一部分,我想在多个不同的项目中使用它。它有使用SQLAlchemy的SQLAlchemy模型,以及视图和模板。我可以通过使用模块获得app.route decorators,但是如何处理SQLAlchemy db对象呢


因为我的组件需要分开,所以我不能只导入db对象。但是我不认为我应该创建db对象两次。如何将其元数据与项目其余部分中的元数据混合?

首先,您必须共享
元数据,并且不要将flask sqlalchemy db.Model用作可重用应用程序的基础

第二步,您必须重新创建所有类,并将它们扩展为支持信号、快捷方式和其他内容的Alchemy的新基础

集成基础(可能有问题):

具有sqlalchemy扩展的烧瓶应用程序示例:

# -*- 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()
还有一些_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))
在本例中,仅测试了db.create\u all和SomeClass.query快捷方式


对不起,我的英语很差。

您应该使用flask.current_app
,它是访问当前应用程序的代理对象,在某些扩展中使用它。因此,您的代码将如下所示:

from flask import current_app
from flaskext.sqlalchemy import SQLAlchemy

db = SQLAlchemy(current_app)

然后像往常一样使用
db
对象。但是我不确定如果用户使用了您的模块并且还需要使用
flaskext.sqlalchemy
,这是否会起作用,可能会有冲突,我建议对此进行测试,以确保您的模块将与任何
flask
应用程序100%兼容。

Hm,我需要尝试一下。你能找到一种方法来配置另一个模块中的模型,使其与主程序中的模型建立关系吗?我认为最好的方法是在可重用的应用程序基类或mixin中声明,然后构建具体的模型子类化它们。
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))
from flask import current_app
from flaskext.sqlalchemy import SQLAlchemy

db = SQLAlchemy(current_app)