簡體   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