2015-09-17 155 views
1

python,flask和sqlalchemy的新手。請幫忙。用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的名稱屬性。現在,我如何動態地 - 在運行時 - 創建一個只有一個列定義(id)的name屬性的空表。一旦創建了表格,我將使用另一個表格來收集字段/列名稱。再次,我想動態地將這些列添加到表中。由於此表及其列不會基於上述預定義的模型,因此如何在應用程序可以與它交互的方式下在運行時創建表和列?我讀過flask-sqlalchemy使用的聲明性基礎,它要求在映射表創建之前定義模型。我可以在flask-sqlalchemy環境中即時創建表格嗎?謝謝。

+1

看起來您的表格結構可能過於複雜。雖然這是可以理解的,但您可能會遇到一個用例,您需要更多的專欄,雖然我確信這可以通過SQL鍊金術實現,但它最終會導致一個hacky或非ORM解決方案。您可以更輕鬆地調查非SQL解決方案,該解決方案可以動態創建列。 –

+0

@F Boucaut不幸的是,我現在只有甲骨文才能與之合作。你可以通過sqlalchemy詳細說明這可能嗎? – okyere

回答

0

我有類似的問題。我改變我的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/