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

时间:2019-08-21 15:43:16

标签: python database postgresql heroku flask

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

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

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

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

使用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命令吗?

1 个答案:

答案 0 :(得分:1)

您正在将SQLAlchemy和PostgreSQL合并。

SQLAlchemy 提供

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

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

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

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


无论是否具有SQLAlchemy,都不能在Heroku上使用SQLite。 SQLite将其数据保存在文件系统上的文件中,这对于Heroku's ephemeral filesystem来说效果不佳。

要在不使用SQLAlchemy的情况下使用Postgres,只需

  • 提供附加组件(如果将psycopg2添加到依赖项中,则会自动发生)
  • 并通过DATABASE_URL环境变量中给出的连接字符串连接到它。
  

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

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

heroku run flask init-db

如果这不起作用,you should be able to做类似的事情

cat schema.sql | heroku pg:psql

尽管我个人首先要研究为什么heroku run并没有做您想要的事情。


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

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