我尝试在PyCharm中使用Python Flask和SQLAlchemy编写一个Web应用程序。我将项目链接到Heroku中的PostgreSQL数据库,现在正尝试创建我编码的表。我的主站点argos.py看起来像这样:
from flask import Flask, render_template, redirect, url_for, flash
from flask_login import LoginManager, login_user, current_user, logout_user
from models import *
from forms import *
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.secret_key = 'replace later'
app.config['SQLALCHEMY_DATABASE_URI']='postgres://[my heroku link]'
db = SQLAlchemy(app)
@app.route('/')
def hello_world():
return render_template('start.html')
[...]
我的models.py看起来像这样:
from flask_login import UserMixin
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.dialects.postgresql import JSON
db = SQLAlchemy()
own = db.Table('own',
db.Column('user_id', db.Integer, db.ForeignKey('user.user_id')),
db.Column('text_id', db.Integer, db.ForeignKey('text.text_id'))
)
class User(UserMixin, db.Model):
__tablename__ = "user"
user_id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(50), unique=True, nullable=False)
email = db.Column(db.String(50), unique=True, nullable=False)
password = db.Column(db.String(50), nullable=False)
owning = db.relationship('Text', secondary=own, backref=db.backref('owners', lazy='dynamic'))
class Text(db.Model):
__tablename__ = "text"
text_id = db.Column(db.Integer, primary_key=True)
text_data = db.Column(JSON, nullable=False)
我尝试通过运行以下命令在PyCharm的python外壳中创建表:
from argos import db
db.create_all()
导入似乎工作得很好,但是当我输入create-command时,什么也没有发生,甚至没有ErrorMessage。我在Windows CMD终端上尝试了相同的操作,并且只创建了一个表(只有两列的文本表),但仍然没有任何反应。我确定我犯了一个初学者的错误,对此我感到抱歉,但是我已经好几个小时没有解决这个问题了,这完全使我发疯。
提前非常感谢你。
保持models.py
原样,但argos.py
根据以下内容进行更改:
# ...
from models import * # @NOTE: <- this also includes 'db'
# ...
app.config['SQLALCHEMY_DATABASE_URI']='postgres://[my heroku link]'
# now "link" the Models (db) to the App (app) [not create a fresh db]
db.init_app(app) # <- instead of: db = SQLAlchemy(app)
# ...
谢谢您的帮助!现在,我至少会收到一个ErrorMessage:“ RuntimeError:找不到应用程序。要么在视图函数内部工作,要么推送应用程序上下文。” 但是我不得不承认,我发现推送应用程序上下文非常令人困惑。
我现在通过添加
with app.app_context(): db.create_all()
和运行脚本来对其进行管理。再次非常感谢!