我如何使用Heroku Postgres与我的flak-sqlalchemy应用程序?

4dbbbstv  于 2022-11-13  发布在  其他
关注(0)|答案(3)|浏览(114)

现在我有一个应用程序,它可以将用户的数据写入一个名为users.sql的数据库文件。但是,我通过github将其推送给heroku,数据并不持久。如果过了一定时间,heroku将进入睡眠状态,并且在检测到另一个登录时必须重新部署所有文件。我听说我可以把heroku postgres作为heroku的插件添加进去,但是我不知道该怎么做才能把它和我现在的代码整合起来。我该怎么做才能设置它呢?

rqcrx0a6

rqcrx0a61#

我在尝试将我的应用程序连接到Postgres时偶然发现了你的问题,并对缺乏明确的说明感到非常沮丧。所以下面是我努力克服所有错误的一步一步的过程(因为这是教程让你喘不过气来的地方,而他们却浑然不觉...)

TL;DR

  • 安装Postgres
  • 安装Heroku CLI
  • 安装psycopg 2或psycopg 2-二进制和gunicorn
  • 使用Postgres数据库在Heroku中创建应用程序,并将数据库URL保存为SQLALCHEMY_DATABASE_URI
  • 创建过程文件、requirements.txt和runtime.txt
  • 推送到Github并将存储库连接到Heroku
  • 部署分支
  • from app import dbdb.create_all()

我使用WSL,所以我的答案中的所有命令行语法都是Bash,而且我使用的是Windows 10。
我正在用youtube的tutorial by Traversy Media,这是他使用的Github repo(我绝对建议最初使用一个基本的应用程序,而不是纠结于一个复杂的应用程序中突然出现的错误)。

开始之前

准备工作

  • 创建一个虚拟环境并安装所有软件包。确保您有psycopg2gunicorn
ERROR: Failed building wheel for psycopg2-binary

不管出于什么原因,psycopg拒绝在我的系统上安装。你可以通过使用pip3 install psycopg2-binary来解决这个问题--就我们的要求而言,没有什么区别。

连接到Postgres

从“开始”菜单打开pgAdmin 4。如果您是第一次登录或注销,可能会提示您输入密码。

could not connect to server: Connection refused (0x0000274D/10061) Is the 
server running on host "127.0.0.1" and accepting TCP/IP connections on port 5432?

使用sudo service postgresql status检查PostgreSQL服务器是否正在运行。如果正在运行,请尝试停止并启动它。如果未运行,请启动它。
sudo service postgresql start
sudo service postgresql stop
在左侧面板中,右键单击Databases,然后单击Create〉Database...。输入数据库名称(本教程使用“lexus”)并保存。
app.py中(或在任何执行数据库配置的地方),找到以下行

if ENV == 'dev':
    ...
    app.config['SQLALCHEMY_DATABASE_URI'] = ''

并将数据库连接字符串放在引号内。语法为

postgresql://[username]:[password]@[host name]/[db name]

# [username] - Right-click on your server in pgAdmin (probably a variation of `PostgreSQL 13`). Go to the Connection tab and check the Username field.

# [password] - The root password you set the first time you logged in to pgAdmin.

# [host name] - In the same place as your username, in the Host name/address field.

# [db name] - The name you entered when creating your database.

在我的例子中,连接字符串是:

app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:123456@localhost/lexus'

重要免责声明

此解决方案让您将数据库密码放在代码中:app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:123456@localhost/lexus'
这会将密码保存在您的版本控制历史记录中,在那里它可以/将最终允许互联网上的任何人控制您的数据库。Yikes!改为从env vars获取数据库用户和密码。

  • 谢谢@保罗·坎特雷尔 *

进入python控制台并创建数据库:

>>> from app import db
>>> db.create_all()

如果你没有得到一个错误,认为自己是自切面包以来最幸运的事情。在pgAdmin中,进入数据库〉[你的数据库名称]〉模式〉表,检查它们是否已经创建。

ImportError: cannot import name 'db' from 'app' (unknown location)

db不在您应用程序中app中请找到定义它位置并从那里导入它

(psycopg2.OperationalError) FATAL:  password authentication failed for user "postgres"

您使用了错误的密码。我觉得这很混乱,因为不清楚您是否需要使用主密码(您第一次登录到pgAdmin时设置的密码)或您要连接的数据库的密码。此处需要主密码。输入psql -h 127.0.0.1 postgrespsql -h [ip address] [username])-进行身份验证的口令是连接字符串所需的口令。

(psycopg2.OperationalError) FATAL:  database "lexus" does not exist

您可能连接到了错误的数据库,使用了错误的用户名,或者您的数据库尚未创建。请检查您的连接字符串和pgAdmin以确认详细信息是否正确。

db.create_all() seemed to work, but I have no tables in pgAdmin!

如果您的数据库模型存储在一个单独的文件中,请在db初始化后将它们导入到app.py中。它应该如下所示:

app = Flask(__name__)
...
db = SQLAlchemy(app)
...
from app.models import *

将数据发送到Postgres

运行应用程序并通过表单提交一些数据(或在您的表中创建一些数据)。在pgAdmin中,右键单击您刚刚创建的表并刷新,然后右键单击并查看/编辑数据。

Could not send data to server: Socket is not connected (0x00002749/10057) could not send SSL negotiation packet: Socket is not connected (0x00002749/10057)

1.断开并重新连接服务器(右键单击服务器,然后单击“断开服务器”,然后单击“连接服务器”),并再次刷新表。
1.如果不起作用,请右键单击服务器并单击“属性”,转到“连接”选项卡,将“主机名/地址”从localhost更改为127.0.0.1。然后重复步骤1。

创建Heroku应用程序

因为我更喜欢直接在Github中使用Heroku而不是CLI,所以我在这里没有使用git init,但是请注意,如果您的代码还不是Github存储库,则需要使用它。
在命令行中:

heroku login # If you have the Heroku CLI installed correctly, this will open a tab in the browser and log you in to Heroku.

heroku create unique-app-name # (replace `unique-app-name` with your own name). This creates an app on the Heroku server, and it's the place your code is cloned to so that it can be run. Check that it has appeared in your [Heroku dashboard](https://dashboard.heroku.com/).

heroku addons:create heroku-postgresql:hobby-dev -a unique-app-name # This creates an empty postgres database for your app. Heroku uses its own database, not your pgAdmin database.

heroku config -a unique-app-name # The url you set earlier as the `SQLALCHEMY_DATABASE_URI` points to the database you created in pgAdmin, but since your app is now going to be using Heroku's database you need a new url. Copy the DATABASE_URL that is returned.

返回到之前设置app.config['SQLALCHEMY_DATABASE_URI']的代码,将新的url插入到else块中,大致如下所示:

if ENV == 'dev':
    app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:123456@localhost/lexus'
else:
    app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres://urlyoujustgotfromherokuozftkndvkayeyc:691196bfb1b1ca8318b733935b10c97a19fd41@ec2-52-71-161-140.compute-1.amazonaws.com:5432/d3pofh2b55a2ct'

如果你使用的是教程中的github repo,设置ENV = 'prod',否则设置config以使用你想要的heroku url。
如果项目文件中尚未包含以下文件,请将它们添加到根目录:
第一个
将所有内容推送到Github(同样,这是如果您已经在存储库中的话,否则您将使用Heroku CLI过程,我不会跟随)。

在Heroku上部署

点击您之前在Heroku dashboard中创建的应用,然后进入Deploy选项卡。在Deploy方法选项中,点击Github。连接您的Github帐户和仓库。
向下滚动到Manual deploy部分并选择要部署的分支(如果只有一个分支,则将其保留为master)。

Requested runtime (python-3.7.2) is not available for this stack (heroku-20).
 !     Aborting.  More info: https://devcenter.heroku.com/articles/python-support
 !     Push rejected, failed to compile Python app.
 !     Push failed


看起来python版本不对。检查runtime.txt是否显示正确的python版本。如果不是,请更新它,删除并重新创建requirements.txt,推送到Github并再次单击部署分支。

创建Heroku数据库

回到命令行:

heroku run python3
>>> from app import db
>>> db.create_all()

要 checkout 数据库,请输入

heroku pg:psql --app unique-app-name

如果运行select * from tablename;,则不会返回任何内容,因为还没有任何数据。
点击Heroku中的“查看”按钮打开您的应用。提交表单(或输入数据,无论您的应用如何工作),然后再次运行select * from tablename;,您将看到数据行。

gc0ot86w

gc0ot86w2#

在你的init.py文件中你可以设置你的app.config ['SQLALCHEMY_DATABASE_URI']变量,这样如果你的应用程序在heroku上运行,它会寻找Heroku给予你的那个变量,或者如果你的应用程序在本地运行,它会使用本地数据库的配置。你可以这样做:

app.config['SQLALCHEMY_DATABASE_URI'] = environ.get('DATABASE_URL') or "postgresql://postgres:password@localhost:5432/postgres"

将OR后面的内容替换为本地连接的连接详细信息
如果你打算使用heroku,我建议你考虑建立一个本地postgres数据库而不是sql,但是从技术上讲,你可以同时使用这两个数据库。你可能会遇到一些小问题,比如,我遇到过一些w/ dates的问题,它们的处理方式略有不同。

yhived7q

yhived7q3#

首先让heroku从终端登录:

$ heroku login

现在使用以下命令为您的应用程序创建数据库:

$ heroku addons:create heroku-postgresql:hobby-dev --app app_name

创建数据库后,使用以下命令获取数据库的URL:

$ heroku config --app app_name

现在,您已经获得了数据库URL,请将“www.example.com“文件中app.config[‘SQLALCHEMY_DATABASE_URI’]行的值替换app.py为以下数据库URL:

app.config['SQLALCHEMY_DATABASE_URI'] = 'heroku_database_url'

最后把代码推给heroku。

相关问题