fix(deps): nommer le pilote PostgreSQL, sinon rien ne demarre
QUA-001, volet dialecte.
`postgresql://` ne veut pas dire "le pilote installe" : SQLAlchemy y lit
psycopg2 et importe ce module a la creation du moteur. requirements.txt
epingle psycopg 3 (`psycopg[binary]`) et pas psycopg2. Une installation
propre demarree sur cette URL leve donc
ModuleNotFoundError: No module named 'psycopg2'
avant la premiere requete. Verifie dans le .venv du depot, et c est
exactement la forme que Render distribue -- celle que docs/deployment.md et
docs/database-restore.md donnaient en exemple.
normalise_database_url() nomme le pilote quand l URL n en nomme pas.
`postgres://` (alias hérite, abandonne par SQLAlchemy en 1.4) est traite de
meme. Une URL qui nomme deja son pilote est laissee telle quelle, y compris
`postgresql+psycopg2://` : un environnement qui a psycopg2 garde le choix.
La normalisation a lieu apres l application de la configuration passee en
argument, pour couvrir aussi les appels de test. backup.py n avait pas
besoin d etre touche : il retirait deja le suffixe +pilote.
Documentation alignee sur les trois fichiers qui donnaient l exemple, dont
docs/deployment.md qui proposait sqlite:/// pour DATABASE_URL alors que
create_app refuse de demarrer sans PostgreSQL.
Reste de QUA-001, dit franchement
- les trois paquets parasites (dotenv, login, discord) ne sont plus dans
requirements.txt : deja retires. psycopg est deja epingle.
- la consolidation vers des groupes de dependances n est PAS faite. Le
deploiement est un miroir de fichiers lftp sans etape de construction ;
les groupes PEP 735 demandent pip >= 25.1 sur une machine dont on ne
peut pas verifier la version d ici. A revoir avec OPS-011.
14 tests, dont trois qui prouvent que l echec est reel et non theorique.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -24,6 +24,8 @@ DISCORD_CLIENT_SECRET=
|
||||
DISCORD_REDIRECT_URI=http://localhost:5000/auth/discord/callback
|
||||
|
||||
#where to find the db (hosted on render for now)
|
||||
#Forme attendue : postgresql://utilisateur:motdepasse@hote:5432/base
|
||||
#Le pilote psycopg 3 est nomme automatiquement par create_app().
|
||||
DATABASE_URL=URI_vers_db_posgres
|
||||
|
||||
|
||||
|
||||
+39
@@ -35,6 +35,40 @@ def nl2br(value):
|
||||
return ''
|
||||
|
||||
|
||||
def normalise_database_url(url):
|
||||
"""Name the PostgreSQL driver explicitly in a connection URL.
|
||||
|
||||
`postgresql://…` does not mean "whichever driver is installed": it means
|
||||
psycopg2, which SQLAlchemy imports at create_engine() time. requirements
|
||||
.txt pins psycopg 3 (`psycopg[binary]`) and no psycopg2, so a clean
|
||||
install starting against the URL Render hands out — and the one this
|
||||
project's own documentation shows — raises
|
||||
|
||||
ModuleNotFoundError: No module named 'psycopg2'
|
||||
|
||||
before the first request. Anything with a driver already spelled out
|
||||
(`postgresql+psycopg://`, `postgresql+psycopg2://`) is left alone, so
|
||||
naming psycopg2 stays possible for an environment that has it.
|
||||
|
||||
`postgres://` is the legacy alias several hosts still emit; SQLAlchemy
|
||||
dropped it in 1.4.
|
||||
|
||||
Args:
|
||||
url: Value of DATABASE_URL, or None.
|
||||
|
||||
Returns:
|
||||
str | None: The URL, with a driver named when it was PostgreSQL.
|
||||
"""
|
||||
if not url:
|
||||
return url
|
||||
scheme, separator, rest = url.partition('://')
|
||||
if not separator or '+' in scheme:
|
||||
return url
|
||||
if scheme in ('postgres', 'postgresql'):
|
||||
return f'postgresql+psycopg://{rest}'
|
||||
return url
|
||||
|
||||
|
||||
def build_csp(*, allow_inline_script, nonce=None):
|
||||
"""Assemble the Content-Security-Policy header.
|
||||
|
||||
@@ -155,6 +189,11 @@ def create_app(config=None):
|
||||
'DATABASE_URL environment variable must be set to a PostgreSQL connection string'
|
||||
)
|
||||
|
||||
# After the overrides, so a caller-supplied URL is normalised too.
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = normalise_database_url(
|
||||
app.config['SQLALCHEMY_DATABASE_URI']
|
||||
)
|
||||
|
||||
# File upload size limit (16 MB)
|
||||
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
|
||||
|
||||
|
||||
Reference in New Issue
Block a user