繁体   English   中英

如何在不使用SQLAlchemy的情况下将Flask应用程序部署到Heroku?

[英]How do deploy a Flask app to Heroku without using SQLAlchemy?

我使用Flask构建了一个应用程序,而没有使用SQLAlchemy(这样我就不会获得ORM,因为这对我来说透明度和理解度较低),因此仅使用SQLite编写普通SQL。

现在,我想在线发布它(现在我想使用免费的Heroku测试它),我发现的所有教程似乎都使用SQLAlchemy来能够使用PostgreSQL而不是SQLite。

我还使用了一个schema.sql文件,其中包含所有代码以创建通过命令flask init-db启动的模式( CREATE TABLE user等)。

我也有点担心,我将需要改变更多的代码,而不仅仅是数据库链接。

使用Flask教程中的db.py代码,我将连接URL更改为使用Heroku给我的那个URL。

def get_db():
    if 'db' not in g:
        if os.environ.get('DATABASE_URL') is None:
            g.db = sqlite3.connect(
                current_app.config['DATABASE'],
                detect_types=sqlite3.PARSE_DECLTYPES
            )
            g.db.row_factory = sqlite3.Row
        else:
            DATABASE_URL = os.environ['DATABASE_URL']
            g.db = psycopg2.connect(DATABASE_URL, sslmode='require')

    return g.db

在最初提交时将代码推送到Heroku时,在我网站的URL上我收到“应用程序错误”消息。 日志说:

2019-08-21T15:12:50.333541+00:00 app[init.1]: Usage: flask [OPTIONS] COMMAND [ARGS]...
2019-08-21T15:12:50.333564+00:00 app[init.1]: Try "flask --help" for help.
2019-08-21T15:12:50.333567+00:00 app[init.1]: 
2019-08-21T15:12:50.333642+00:00 app[init.1]: Error: No such command "init_db".
2019-08-21T15:12:50.434989+00:00 heroku[init.1]: Process exited with status 2
2019-08-21T15:12:54.909027+00:00 heroku[init.1]: Starting process with command `FLASK_APP=myapp flask init_db`
2019-08-21T15:12:55.504819+00:00 heroku[init.1]: State changed from starting to up
2019-08-21T15:12:57.997833+00:00 heroku[init.1]: State changed from up to crashed
2019-08-21T15:12:57.888599+00:00 app[init.1]: Usage: flask [OPTIONS] COMMAND [ARGS]...
2019-08-21T15:12:57.888627+00:00 app[init.1]: Try "flask --help" for help.
2019-08-21T15:12:57.888630+00:00 app[init.1]: 
2019-08-21T15:12:57.888639+00:00 app[init.1]: Error: No such command "init_db".
2019-08-21T15:12:57.978596+00:00 heroku[init.1]: Process exited with status 2

那么,我可以不使用SQLAlchemy或至少不使用ORM轻松地将Flask应用程序部署到Heroku以便我可以使用普通的SQL命令吗?

您正在将SQLAlchemy和PostgreSQL混合在一起。

SQLAlchemy提供

  • 一个统一的,相对底层的接口,用于通过SQLAlchemy Core处理许多不同的数据库后端,以及
  • 可选的ORM

它可以与PostgreSQL和SQLite(及其他)一起使用。

PostgreSQL是一个关系数据库管理系统,就像SQLite一样。

您可以直接使用Postgres,例如使用psycopg2或类似SQLAlchemy的东西。


无论是否带有SQLAlchemy,您都不能在Heroku上使用SQLite。 SQLite将其数据保存在文件系统上的文件中,这与Heroku的临时文件系统不能很好地配合使用。

要使用不带SQLAlchemy的Postgres,只需

  • 设置加载项(如果将psycopg2添加到依赖项中,则应该自动发生),
  • 并通过DATABASE_URL环境变量中提供的连接字符串连接到它。

我还使用了一个schema.sql文件,其中包含所有代码以创建通过命令flask init-db启动的模式( CREATE TABLE user等)。

只要schema.sql是应用程序的一部分,您就应该能够

heroku run flask init-db

如果这样不起作用, 您应该可以执行类似的操作

cat schema.sql | heroku pg:psql

尽管我个人首先要研究为什么heroku run不能做到您想要的。


最后,我强烈建议在开发中也切换到PostgreSQL。

SQLite和PostgreSQL是不同的产品,它们的行为并不总是相同的。 可以通过ORM或SQLAlchemy的Core实现某种程度的一致性(尽管即使如此,我还是建议在各处使用相同的数据库),但是如果您编写的是原始SQL,则差异变得更加重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM