Warm tip: This article is reproduced from serverfault.com, please click

python-使用SQLAlchemy在Flask中创建表不起作用

(python - Creating tables in Flask using SQLAlchemy does not work)

发布于 2020-11-28 11:22:12

我尝试在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终端上尝试了相同的操作,并且只创建了一个表(只有两列的文本表),但仍然没有任何反应。我确定我犯了一个初学者的错误,对此我感到抱歉,但是我已经好几个小时没有解决这个问题了,这完全使我发疯。

提前非常感谢你。

Questioner
Pastor Nolte
Viewed
11
van 2020-11-29 22:17:09

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

# ...