【问题标题】:How do deploy a Flask app to Heroku without using SQLAlchemy?如何在不使用 SQLAlchemy 的情况下将 Flask 应用程序部署到 Heroku?
【发布时间】:2019-12-26 22:38:27
【问题描述】:

我用 Flask 构建了一个应用程序,没有使用 SQLAlchemy(所以我没有得到 ORM,这对我来说透明度和理解力都比较低),所以只使用 SQLite 的普通 SQL。

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

我还使用了包含所有代码的schema.sql 文件来创建使用命令flask init-db 启动的架构(CREATE TABLE user 等)。

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

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

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 命令?

【问题讨论】:

    标签: python database postgresql heroku flask


    【解决方案1】:

    您将 SQLAlchemy 和 PostgreSQL 混为一谈。

    SQLAlchemy 提供

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

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

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

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


    你不能在 Heroku 上使用 SQLite,不管有没有 SQLAlchemy。 SQLite 将其数据保存在文件系统上的一个文件中,这与 Heroku's ephemeral filesystem 不兼容。

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

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

    我还在使用包含所有代码的schema.sql 文件来创建使用命令flask init-db 启动的架构(CREATE TABLE user 等)。

    只要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 的核心来衡量一致性(尽管即便如此,我还是建议在任何地方使用相同的数据库),但如果您正在编写原始 SQL,则差异变得更加重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-20
      • 2012-11-22
      • 1970-01-01
      • 2013-02-10
      • 2011-08-13
      • 2015-05-20
      • 2020-01-23
      相关资源
      最近更新 更多