[英]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提供
它可以與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.