使用Flask-Sqlalchemy

时间:2015-09-17 20:01:58

标签: python flask flask-sqlalchemy

python,flask和sqlalchemy的新手。请帮忙。

我正在用烧瓶写一个小应用程序。我已经将一些模型定义为:

class Field(db.Model):
    __tablename__ = 'fields'

    id = db.Column(db.Integer, db.Sequence('FIELDS_SEQ'), primary_key=True)
    name = db.Column(db.String(120), nullable=False)
    position = db.Column(db.Integer)

    # a field has only one type
    type_id = db.Column(db.Integer, db.ForeignKey(FieldType.id))

    # a field only belongs to one table
    table_info_id = db.Column(db.Integer, db.ForeignKey('tables_info.id'), unique=True)

    _create_db_sequence('FIELDS_SEQ')


class TableInfo(db.Model):
    __tablename__ = 'tables_info'

    id = db.Column(db.Integer, db.Sequence('TABLES_INFO_SEQ'), primary_key=True)
    name = db.Column(db.String(120), unique=True, nullable=False)

    # a table can have a lot of fields
    fields = db.relationship(Field, backref='table_info', lazy='joined')

    # a table only belongs to one department
    department_id = db.Column(db.Integer, db.ForeignKey('departments.id'))

    _create_db_sequence('TABLES_INFO_SEQ')

所以我有一个表单来收集TableInfo的name属性。现在,我如何动态地 - 在运行时 - 创建一个空表,其中name属性只有一个列定义(id)。创建表后,我将使用另一个表单来收集字段/列名称。同样,我想动态地将这些列添加到表中。由于此表及其列不会基于上面的预定义模型,如何在运行时以应用程序可以与之交互的方式创建表和列?我读到flask-sqlalchemy使用声明性基础,它需要在创建映射表之前定义模型。我可以在flask-sqlalchemy环境中动态创建表吗?感谢。

1 个答案:

答案 0 :(得分:1)

我有类似的问题。我改变了我的model.py并希望升级我的数据库。

以下是我为升级而做的事情。我不知道这是否是正确的方法,但它是有效的。

我创建了一个文件manage.py

import os
from flask import Flask
from dictiofquestions import dico
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from core import db
from Models import Questions

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

db.init_app(app)
migrate = Migrate(app, db)

manager = Manager(app)
manager.add_command('db', MigrateCommand)


if __name__ == "__main__":
    manager.run()

不要忘记这个ligne app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = 'True'

这是我的文件core.py

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

我的models.py

from core import db

class Questions(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    question = db.Column(db.String(200), unique=True)
    resp1 = db.Column(db.String(80), unique=False)
    resp2 = db.Column(db.String(80), unique=False)
    resp3 = db.Column(db.String(80), unique=False)
    resp4 = db.Column(db.String(80), unique=False)
    valideresp = db.Column(db.String(5), unique=False)
    categorie = db.Column(db.String(50), unique=False)

    def __init__(self, question, resp1, resp2, resp3, resp4, valideresp, categorie):
        self.question = question
        self.resp1 = resp1
        self.resp2 = resp2
        self.resp3 = resp3
        self.resp4 = resp4
        self.valideresp = valideresp
        self.categorie = categorie

    def __repr__(self):
        return '<Questions %r>' % self.question

在我的控制台中输入命令:

python manage.py db init
python manage.py db migrate
python manage.py db upgrade

就像我可以使用这3个命令升级我的数据库。 如果您需要更多信息,我想您可以转到此页面。 https://flask-migrate.readthedocs.io/en/latest/