【问题标题】:Creating tables in Flask using SQLAlchemy does not work使用 SQLAlchemy 在 Flask 中创建表不起作用
【发布时间】:2021-03-10 22:14:36
【问题描述】:

我尝试在 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 shell 中创建表:

from argos import db
db.create_all()

导入似乎工作得很好,但是当我输入创建命令时,什么都没有发生,甚至没有错误消息。我从我的 Windows CMD 终端尝试了同样的事情,并且只创建了一个表(只有两列的文本表),但仍然没有任何反应。我确定我犯了一个初学者的错误,对此我很抱歉,但我已经好几个小时没能解决这个问题了,这完全让我发疯了。

非常感谢您。

【问题讨论】:

  • 你在 db.create_all() 之后错过了 db.session.commit()
  • 感谢您的建议,但遗憾的是没有奏效。
  • 你在建表之前定义模型了吗?
  • 不确定我是否明白了这一点,但当然我在models.py中定义了模型并将它们导入到主页argos.py中,然后再尝试在python控制台中创建它们。
  • 我想知道models.py中的db = SQLAlchemy()是不是罪魁祸首?它实际上与app 无关。尝试将 import dbargos.py 移动到 models.py 并使用它而不是 db = SQLAlchemy()

标签: python postgresql flask heroku sqlalchemy


【解决方案1】:

保持 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)

# ...

【讨论】:

  • 感谢您的帮助!现在我至少收到一条错误消息:“RuntimeError:未找到应用程序。要么在视图函数中工作,要么推送应用程序上下文。”但我不得不承认,我发现推送应用程序上下文非常令人困惑。
  • 我现在通过添加with app.app_context(): db.create_all() 并运行脚本来管理它。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 2016-03-18
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
相关资源
最近更新 更多