117 votes

Ecrire une chaîne de connexion lorsque le mot de passe contient des caractères spéciaux

Je suis en train d'utiliser SQLalchemy pour un projet Python et je veux avoir une chaîne de connexion propre pour accéder à ma base de données. Par exemple :

engine = create_engine('postgresql://user:pass@host/base_de_données')

Le problème est que mon mot de passe contient une séquence de caractères spéciaux qui sont interprétés comme des délimiteurs lorsque j'essaie de me connecter.

Je réalise que je pourrais simplement utiliser engine.URL.create() et ensuite transmettre mes identifiants de cette manière :

import sqlalchemy as sa

connection_url = sa.engine.URL.create(
    drivername="postgresql",
    username="utilisateur",
    password="p@ss",
    host="hôte",
    database="base_de_données",
)
print(connection_url)
# postgresql://utilisateur:p%40ss@hôte/base_de_données

Mais je préférerais vraiment utiliser une chaîne de connexion si c'est possible.

Donc pour être clair, est-il possible de coder ma chaîne de connexion, ou la partie mot de passe de la chaîne de connexion - afin qu'elle puisse être correctement analysée ?

176voto

rcoder Points 4517

Vous devez encoder en URL la partie mot de passe de la chaîne de connexion :

from urllib.parse import quote_plus
from sqlalchemy.engine import create_engine
engine = create_engine("postgres://user:%s@host/database" % quote_plus("p@ss"))

Si vous regardez l'implémentation de la classe utilisée dans SQLAlchemy pour représenter les URL de connexion à la base de données (dans sqlalchemy/engine/url.py), vous pouvez voir qu'ils utilisent la même méthode pour échapper aux mots de passe lors de la conversion des instances URL en chaînes.

45voto

prdip Points 151

En Python 3.x, vous devez importer urllib.parse.quote:

Le module urllib a été divisé en parties et renommé en Python 3 en urllib.request, urllib.parse et urllib.error.

Lorsque vous essayez de connecter la base de données MySQL avec un mot de passe contenant une séquence de caractères spéciaux et que votre version de Python est Python3

user_name est votre identifiant pour la base de données
database est le nom de votre base de données
votre_mot_de_passe mot de passe avec des caractères spéciaux

 from urllib.parse import quote  
 from sqlalchemy.engine import create_engine
 engine = create_engine('mysql+mysqlconnector://user_name:%s@localhost:3306/database' % quote('votre_mot_de_passe'))

11voto

Nikita Malviya Points 131

MÉTHODE 1:

Le mot de passe contient "@", vous pouvez échapper au caractère "@" en utilisant "%40" à la place.

AVANT:

# mssql+pymssql://username:password@databaseserver/database

mssql+pymssql://admin:admin123@10.10.10.110/dbtest

APRÈS:

mssql+pymssql://admin:admin%40123@10.10.10.110/dbtest

MÉTHODE 2:

Encodez le mot de passe en utilisant urllib.parse.quote_plus.

DATABASE_PASSWORD = "admin@123"

# pour éliminer l'erreur, si le mot de passe contient des caractères spéciaux comme '@'
DATABASE_PASSWORD_UPDATED = urllib.parse.quote_plus(DATABASE_PASSWORD)

Voici l'extrait de code complet :

import os, sys, click, urllib
from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import text

# Assurez-vous de remplacer les données ci-dessous par vos valeurs de DB
DATABASE_HOST = "10.10.10.110"
DATABASE_NAME = "dbtest"
DATABASE_USERNAME = "admin"
DATABASE_PASSWORD = "admin@123"

app = Flask(__name__)

# Pour éliminer l'erreur, si le mot de passe contient des caractères spéciaux comme '@'
# remplacez DATABASE_PASSWORD par DATABASE_PASSWORD_UPDATED.

DATABASE_PASSWORD_UPDATED = urllib.parse.quote_plus(DATABASE_PASSWORD)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mssql+pymssql://'+DATABASE_USERNAME+':'+DATABASE_PASSWORD_UPDATED+'@'+DATABASE_HOST+'/'+DATABASE_NAME
app.config['SQLALCHEMY_ECHO'] = True

db = SQLAlchemy(app)

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

-1voto

Ned Batchelder Points 128913

Cela dépendra de la façon dont SQLAlchemy analyse la chaîne de connexion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X