密码包含特殊字符时写入连接字符串

Key*_*upt 28 python connection-string sqlalchemy character-encoding

我正在使用SQLalchemy作为Python项目,我希望有一个整洁的连接字符串来访问我的数据库.例如:

engine = create_engine('postgres://user:pass@host/database')
Run Code Online (Sandbox Code Playgroud)

问题是我的密码包含一系列特殊字符,在我尝试连接时会被解释为分隔符.

我意识到我可以创建一个对象然后传递我的凭据,如下所示:

drivername  = 'postgres',
username    = 'user', 
password    = 'pass', 
host        = 'host',
database    = 'database'
Run Code Online (Sandbox Code Playgroud)

但是如果可能的话,我宁愿使用连接字符串.

所以要清楚,是否可以编码我的连接字符串或连接字符串的密码部分 - 以便可以正确解析它?

rco*_*der 49

反斜杠不是URL组件字符串的有效转义字符.您需要对连接字符串的密码部分进行URL编码:

from urllib import quote_plus as urlquote
from sqlalchemy.engine import create_engine
engine = create_engine('postgres://user:%s@host/database' % urlquote('badpass'))
Run Code Online (Sandbox Code Playgroud)

如果您查看SQLAlchemy中使用的类的实现来表示数据库连接URL(in sqlalchemy/engine/url.py),您可以看到它们在将URL实例转换为字符串时使用相同的方法来转义密码,并且解析代码使用补充urllib.unquote_plus函数从连接字符串中提取密码.

  • 在Python 3中,`urllib.quote_plus`不存在,而是可以使用[`urllib.parse.quote_plus`](https://docs.python.org/3.1/library/urllib.parse.html#urllib.parse .quote_plus). (16认同)

prd*_*dip 44

在Python 3.x中,需要导入urllib.parse.quote:

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

当您尝试使用包含特殊字符序列的密码连接数据库MySQL并且您的Python版本是Python3时

user_name是您的数据库用户 ID
数据库是您的数据库名称
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'))
Run Code Online (Sandbox Code Playgroud)


Nik*_*iya 11

方法一:

密码中包含“@” ,您可以使用“%40”来转义“@”字符。

前:

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

mssql+pymssql://admin:admin123@10.10.10.110/dbtest
Run Code Online (Sandbox Code Playgroud)

后:

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

Run Code Online (Sandbox Code Playgroud)

方法二:

使用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)
Run Code Online (Sandbox Code Playgroud)

这是完整的代码片段:

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)

Run Code Online (Sandbox Code Playgroud)