簡體   English   中英

將外部數據庫模型導入Flask應用程序時,為什么會出現NameError?

[英]Why do I get a NameError when importing external DB models into my Flask App?

我正試圖將我的模型分成一個單獨的文件,因為它太大了,無法管理。 我已遵循此步驟,但是盡管已運行db.create_all(),但仍收到NameError:

NameError:名稱“ importsTable”未定義

# stack_app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from stack_dbmodels import db
from stack_dbmodels import importsTable
from datetime import datetime

app = Flask(__name__)
app.secret_key = 'secretsquirrel'

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///stack_newAppCsv.db'
db.init_app(app)

@app.route('/', methods=['GET'])
def stack():
    username = "username"
    new_user = importsTable(username)
    db.session.add(new_user)
    db.session.commit()
    return "Done!"

if __name__ == "__main__":
    app.run(debug = True, port=8080)

我的模型文件:

# stack_dbmodels.py
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class importsTable(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80))

    def __init__(self, username):
        self.username = username

    def __repr__(self):
        return '<Import {0}>'.format(self.username)

問題主要是與應用程序的上下文有關,但是在我的測試過程中,我發現了一些陷阱。 進行上述工作的關鍵是:

當我引用importsTable時,除非沒有這樣做,否則最初並未定義它:

from stack_dbmodels import db
from stack_dbmodels import importsTable

創建.db文件時,上下文不正確,因此無法創建實際的importsTable,因此我添加了以下內容並解決了問題,關鍵是“ with app.app_context()”:

db.init_app(app)
with app.app_context():
    db.create_all()

Final working code was:

# stack_app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from stack_dbmodels import db
from stack_dbmodels import importsTable
from datetime import datetime

app = Flask(__name__)
app.secret_key = 'secretsquirrel'

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///stack_newAppCsv.db'
db.init_app(app)
with app.app_context():
    db.create_all()

@app.route('/', methods=['GET'])
def stack():
    username = "username"
    new_user = importsTable(username)
    db.session.add(new_user)
    db.session.commit()
    return "Done!"

if __name__ == "__main__":
    app.run(debug = True, port=8080)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM