遇到的问题
??使用python3.x 的sqlalchemy 操作数据库,在windows 环境运行正常,部署到linux 服务器上以后,出现无法运行的情况,而且问题必现。
报错内容如下:
python3 db_test.py
mysql+pymysql://root:xxxx@163@127.0.0.1:3306/robot?charset=utf8
查询失败 (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on '163@127.0.0.1' ([Errno -2] Name or service not known)")
(Background on this error at: http://sqlalche.me/e/14/e3q8)
select_calls_detail_not_complete_list(2021-09-10 14:53:31.313293, 2021-09-10 14:54:31.313313)
??看描述应该是@ 符号导致的解析问题。
原始代码如下:
from sqlalchemy import create_engine
userName = 'root'
password = 'xxxx@163'
dbHost = '127.0.0.1'
dbPort = 3306
dbName = 'robot'
DB_CONNECT = f'mysql+pymysql://{userName}:{password}@{dbHost}:{dbPort}/{dbName}?charset=utf8'
engine = create_engine(
DB_CONNECT,
max_overflow=50,
pool_size=50,
pool_timeout=5,
pool_recycle=-1,
encoding='utf-8',
echo=False
)
解决方案
??由于怀疑是密码解析问题,所以对密码进行编码处理的尝试。
??使用了python 的urllib 库中提供了quote_plus 编码方法,问题解决。
??代码如下:
from urllib.parse import quote_plus as urlquote
DB_CONNECT = f'mysql+pymysql://{userName}:{urlquote(password)}@{dbHost}:{dbPort}/{dbName}?charset=utf8'
知识扩展
下面简单介绍quote 与quote_plus 的区别:
urllib.quote(s, safe='/')
??接受参数s 为字符串,safe 是指定某字符不被urlencode ,默认为’/’,如指定’+’、’/'不需转换,传 ‘+/’ 和 ‘+ /’ 均可,同时会将空格 转换为%20 。
??代码示例:
>>> urllib.quote(u'老王 /+'.encode('utf8'))
'%E8%80%81%E7%8E%8B%20/%2B'
urllib.quote_plus(s, safe='')
??此方法的源码为:
def quote_plus(s, safe=''):
"""Quote the query fragment of a URL; replacing ' ' with '+'"""
if ' ' in s:
s = quote(s, safe + ' ')
return s.replace(' ', '+')
return quote(s, safe)
??可以看出它比quote 多一些功能,但是会将“空格”转换成“加号”,默认safe 为空。
??代码示例:
>>> urllib.quote_plus(u'老王 /+'.encode('utf8'))
'%E8%80%81%E7%8E%8B+%2F%2B'
|