Python 使用Flask Sqlalchemy动态创建/更新/删除表
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
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()
不要忘记这个ligneapp.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