Ошибка при подключении к базе данных с помощью SQLAlchemy и fastAPI

#python-3.x #heroku #sqlalchemy #fastapi

Вопрос:

У меня есть эта настройка в небольшом приложении fastAPI:

 host_server = os.environ.get('host_server', 'localhost')
db_server_port = urllib.parse.quote_plus(str(os.environ.get('db_server_port', '5432')))
database_name = os.environ.get('database_name', 'mydatabasename123')
db_username = urllib.parse.quote_plus(str(os.environ.get('db_username', 'myusername123')))
db_password = urllib.parse.quote_plus(str(os.environ.get('db_password', 'mypassword123')))
ssl_mode = urllib.parse.quote_plus(str(os.environ.get('ssl_mode', 'prefer')))
DATABASE_URL = 'postgresql://{}:{}@{}:{}/{}?sslmode={}'.format(db_username, db_password, host_server, db_server_port,
                                                               database_name, ssl_mode)

database = databases.Database(DATABASE_URL)
 

локально это работает, но когда я пытаюсь развернуть его в heroku, я кое-что меняю. Я использую переменную DATABASE_URL env, предоставленную на Heroku:

 DATABASE_URL = 'postgres://...'
database = databases.Database(DATABASE_URL)
 

или делать

 DATABASE_URL = os.environ.get('DATABASE_URL')

database = databases.Database(DATABASE_URL)

metadata = sqlalchemy.MetaData()

engine = sqlalchemy.create_engine(
    DATABASE_URL, pool_size=3, max_overflow=0, echo=True
)

 

журналы дают мне:

 : at=error code=H10 desc="App crashed" method=GET path="/" 
 

Ответ №1:

«postgres» больше не принимается в качестве диалектного имени в SQLAlchemy. Правильная форма — «postgresql», так как вы используете локально:

 DATABASE_URL = 'postgresql://...'
 

Использование 'postgres://...' повышений

 sqlalchemy.exc.ArgumentError: Could not parse rfc1738 URL from string 'postgres//...'
 

Это изменение было внесено в SQLAlchemy 1.4.0b1