首页 > 解决方案 > 尝试本地运行时出现 SqlAlchemy 问题

问题描述

我试图更好地学习如何使用 sqlalchemy 并部署到 heroku。除了一些其他问题,我决定首先在本地测试应用程序,然后担心部署它,但是在尝试运行它时出现了一些错误。

在运行之前,我确实在终端中设置了数据库变量和应用程序设置,但我仍然无法让它运行并从那里继续。

这是我从终端得到的错误

(venv) C:\Users\Stratos\Desktop\test-orm>python app.py
Traceback (most recent call last):
  File "app.py", line 11, in <module>
    from models import Result
  File "C:\Users\Stratos\Desktop\test-orm\models.py", line 1, in <module>
    from app import db
  File "C:\Users\Stratos\Desktop\test-orm\app.py", line 11, in <module>
    from models import Result
ImportError: cannot import name 'Result' from partially initialized module 'models' (most likely due to a circular import) (C:\Users\Stratos\Desktop\test-orm\models.py)

这是我尝试直接从 vscode 运行时遇到的错误

Traceback (most recent call last):
  File "c:/Users/Stratos/Desktop/test-orm/app.py", line 7, in <module>
    app.config.from_object(os.environ['APP_SETTINGS'])
  File "c:\users\stratos\appdata\local\programs\python\python38-32\lib\os.py", line 675, in __getitem__
    raise KeyError(key) from None
KeyError: 'APP_SETTINGS'

应用程序.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os


app = Flask(__name__)
app.config.from_object(os.environ['APP_SETTINGS'])
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

from models import Result


@app.route('/')
def hello():
    return "Hello World!"


@app.route('/<name>')
def hello_name(name):
    return "Hello {}!".format(name)


if __name__ == '__main__':
    app.run()

管理.py

import os
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

from app import app, db


app.config.from_object(os.environ['APP_SETTINGS'])

migrate = Migrate(app, db)
manager = Manager(app)

manager.add_command('db', MigrateCommand)


if __name__ == '__main__':
    manager.run()

模型.py

from app import db
from sqlalchemy.dialects.postgresql import JSON


class Result(db.Model):
    __tablename__ = 'results'

    id = db.Column(db.Integer, primary_key=True)
    url = db.Column(db.String())
    result_all = db.Column(JSON)
    result_no_stop_words = db.Column(JSON)

    def __init__(self, url, result_all, result_no_stop_words):
        self.url = url
        self.result_all = result_all
        self.result_no_stop_words = result_no_stop_words

    def __repr__(self):
        return '<id {}>'.format(self.id)

配置文件

import os
basedir = os.path.abspath(os.path.dirname(__file__))


class Config(object):
    DEBUG = False
    TESTING = False
    CSRF_ENABLED = True
    SECRET_KEY = 'this-really-needs-to-be-changed'
    SQLALCHEMY_DATABASE_URI = os.environ['DATABASE_URL']


class ProductionConfig(Config):
    DEBUG = False


class StagingConfig(Config):
    DEVELOPMENT = True
    DEBUG = True


class DevelopmentConfig(Config):
    DEVELOPMENT = True
    DEBUG = True


class TestingConfig(Config):
    TESTING = True

.env 文件


set APP_SETTINGS=config.DevelopmentConfig
set DATABASE_URL=postgresql://postgres:798361!@localhost:5432/dok

标签: pythonpostgresqlflasksqlalchemy

解决方案


推荐阅读