Flask-Sqlalchemy,带有bind和外键的多个数据库

时间:2017-06-18 08:38:33

标签: python flask-sqlalchemy

我已使用flask设置了一个应用程序,并使用Flask-SQLAlchemy设置了一些模型。我想将一些JSON对象存储到一个单独的数据库中,因为这个数据库不会被频繁读取,只能写入。其他数据存储在主数据库中。

这很好用,除了我想在JSON数据库中的表和主数据库之间建立关系。如果我将表保存在同一个数据库中,这很有效(通过注释__bind_key__ = 'forms'),但正如我所说,我希望将数据库分开。

我已尝试在此处查看各种解决方案,以及StackOverflow上的其他相关帖子。我显然做错了什么。

目前,我在运行python models.py时遇到此错误:

(psycopg2.ProgrammingError) relation "filled_form_data" does not exist
 sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) relation "filled_form_data" does not exist
[SQL: '\nCREATE TABLE filled_form_modified    (\n\tid SERIAL NOT NULL, \n\tdate TIMESTAMP WITHOUT TIME ZONE, \n\tfilled_form_data_id INTEGER, \n\tPRIMARY KEY (id), \n\tUNIQUE (id), \n\tFOREIGN KEY(filled_form_data_id) REFERENCES filled_form_data (id)\n)\n\n']

我认为我还需要在某处以某种方式指定数据库,但我虽然sqlalchemy会为我做这件事。我对这里的文档页面感到有点困惑:http://flask-sqlalchemy.pocoo.org/2.1/binds/

我真的很感谢你对此的帮助。

models.py

from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
db = SQLAlchemy()



class FilledFormData(db.Model):
    """Table of json-data for forms."""
    __bind_key__ = 'forms'
    __tablename__ = 'filled_form_data'
    id = db.Column(db.Integer, primary_key=True, unique=True)
    request_form = db.Column(db.JSON)  # All data from the users-form
    form_data = db.Column(db.JSON)  # All data actually used to fill the pdf.


class FilledFormModified(db.Model):
    """Table of modification-dated for FilledForm-model."""
    id = db.Column(db.Integer, primary_key=True, unique=True)
    date = db.Column(db.DateTime, default=datetime.utcnow)
    filled_form_data_id = db.Column(db.Integer, db.ForeignKey(FilledFormData.id))
    filled_form_data = db.relationship(
        FilledFormData, primaryjoin='FilledFormModified.filled_form_data_id==FilledFormData.id')  # noqa
    info = {'bind_key': 'forms'}




app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres:///varmekabler'
app.config['SQLALCHEMY_BINDS'] = {
    'products': 'postgres:///vk_products',
    'forms': 'postgres:///vk_forms'
}
db.init_app(app)
with app.app_context():

    db.drop_all()
    db.create_all()

0 个答案:

没有答案