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环境中动态创建表吗?感谢。
答案 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/