当密码包含特殊字符时如何编写连接字符串

117 投票
3 回答
116701 浏览
提问于 2025-04-15 14:19

我在做一个Python项目,使用SQLalchemy来连接数据库。我想要一个整洁的连接字符串来访问我的数据库。比如说:

engine = create_engine('postgresql://user:pass@host/database')

问题是我的密码里有一些特殊字符,这些字符在我尝试连接时被当作分隔符来处理。

我知道我可以使用 engine.URL.create() 方法,然后像这样传递我的凭证:

import sqlalchemy as sa

connection_url = sa.engine.URL.create(
    drivername="postgresql",
    username="user",
    password="p@ss",
    host="host",
    database="database",
)
print(connection_url)
# postgresql://user:p%40ss@host/database

但如果可以的话,我更想用连接字符串。

所以我想问一下,是否可以对我的连接字符串,或者连接字符串中的密码部分进行编码,这样它就能被正确解析了?

3 个回答

11

方法 1:

如果密码里有"@"这个符号,你可以用"%40"来代替它。

之前:

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

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

之后:

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

方法 2:

可以使用urllib.parse.quote_plus来编码密码。

DATABASE_PASSWORD = "admin@123"

# to elimate the error, if the password contains special characters like '@' 
DATABASE_PASSWORD_UPDATED = urllib.parse.quote_plus(DATABASE_PASSWORD)

下面是完整的代码示例:

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

# Make sure to replace below data with your DB values
DATABASE_HOST = "10.10.10.110"
DATABASE_NAME = "dbtest"
DATABASE_USERNAME = "admin" 
DATABASE_PASSWORD = "admin@123"

app = Flask(__name__)

# to elimate the error, if the password contains special characters like '@'
# replace the DATABASE_PASSWORD with 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)

45

在Python 3.x中,你需要导入urllib.parse.quote这个模块:

在Python 3中,urllib模块被拆分成了几个部分,并重新命名为urllib.request、urllib.parse和urllib.error。

当你想要连接MySQL数据库,而你的密码中包含一些特殊字符,并且你使用的是Python 3版本时,

user_name 是你在数据库中的用户名
database 是你的数据库名称
your_password 是包含特殊字符的密码

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

你需要对连接字符串中的密码部分进行URL编码:

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

如果你查看SQLAlchemy中用于表示数据库连接URL的类的实现(在 sqlalchemy/engine/url.py),你会发现他们在将URL实例转换成字符串时,使用了相同的方法来处理密码的转义。

撰写回答