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函数从连接字符串中提取密码.
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)
| 归档时间: |
|
| 查看次数: |
19435 次 |
| 最近记录: |