使用Flask、Python和PostgreSQL,我如何连接到一个现有的数据库?

9

我希望连接到一个已存在的postgres数据库,但我的应用程序中没有与之相关联的模型。也许并不意外,这证明是有困难的,除此之外,这是我第一次尝试使用Python和Flask。

以下是我的app/py代码:

import os
from flask import Flask
from flask import render_template
from flask.ext.sqlalchemy import SQLAlchemy  
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres://blah:blah@ec2-54-227-254-13.compute-1.amazonaws.com:5432/mydb'
db = SQLAlchemy(app)
db.create_all()
db.session.commit()

@app.route("/")
def main():
    return render_template('index.html')


@app.route('/base')
def base():
    myusers = users.all()
    return render_template('base.html')

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

我已经实现了def main()的功能。

在视图(base.html)中,我们有:

{% for user in myusers %}
    <div><p>{{ user.first_name }} </b></p></div>
    {% endfor %}

当我进入 base.html 页面时,持续出现一个错误:NameError: global name 'users' is not defined。可能有很多问题,我到底做错了什么?非常感谢您的帮助。谢谢。
1个回答

15

你需要对现有的数据库进行反向工程处理,以生成SQLAlchemy可以使用的Python模型。

sqlacodegen可以为您完成此操作,使用pip安装它-pip install sqlacodegen

您可以使用以下命令提示符生成您的模型:

sqlacodegen --outfile c:/temp/models.py postgres://blah:blah@ec2-54-227-254-13.compute-1.amazonaws.com:5432/mydb

将生成的 models.py 文件复制到您的项目文件夹中,并记得导入所需的模型类,例如您的 User 类。

检查 models.py 文件以查看表如何转换为类,特别是生成的类名称的大小写 - 例如 "User" 或 "user"。

假设在 models.py 中生成的用户类名为 "User",您需要将 "myusers" 变量传递给您的模板:

@app.route('/base')
def base():
    myusers = db.session.query(User).all()
    return render_template('base.html', myusers=myusers)

不要忘记在app.py文件的顶部导入用户模型(您需要检查由sqlacodgen生成的用户类的名称):

from models import User

谢谢,我会尝试一下,然后运行python models.py吗? - user1903663
谢谢,正如您建议的那样,它生成了一个漂亮的文件。现在我该怎么办?很抱歉我这么蠢。所以我是将其导入我的应用程序文件还是运行python models.py?还是其他什么...? - user1903663
非常感谢,运行得很好。我非常感激你。但是我还有很多东西要学习! - user1903663

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接