Python 使用Flask Sqlalchemy动态创建/更新/删除表

Python 使用Flask Sqlalchemy动态创建/更新/删除表,python,flask,flask-sqlalchemy,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

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使用声明性基础,它要求在创建映射表之前定义模型。我可以在炼金术环境中动态创建表吗?谢谢。

我也有类似的问题。我更改了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\u TRACK\u MODIFICATIONS']=“True”

这是我的core.py文件

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
还有我的模特

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
这样,我可以升级我的数据库时,我想用这3个命令。 如果你需要更多的信息,我想你可以进入这个页面。

看起来您的表结构可能过于复杂。虽然这是可以理解的,但您可能会有一个需要更多列的用例,虽然我相信这将通过SQL alchemy实现,但最终将是一个黑客或非ORM解决方案。您可以更轻松地研究无sql解决方案,该解决方案允许动态创建列。@F Boucaut不幸的是,我现在只有Oracle可以使用。你能详细说明这是如何通过sqlalchemy实现的吗?
python manage.py db init
python manage.py db migrate
python manage.py db upgrade