codcodog / Blog

h2O's Blog
20 stars 1 forks source link

Sqlalchemy 连接错误 #80

Open codcodog opened 6 years ago

codcodog commented 6 years ago

Sqlalchemy 连接错误

在使用 Pythonsqlalchemy 库连接 Mysql 的时候遇到这样一个错误:

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'119.137.52.47' (using password: YES)")

报这样的错很纳闷,因为在本地使用 myclimysql-workbench 都是可以连接上 Mysql 服务器的, 不存在 帐号没权限,帐号密码不匹配 的情况.

代码如下:

from sqlalchemy import *

from config import Config

class DB:

    def __init__(self):
        '''初始化,连接数据库
        '''
        DB_CONN = 'mysql+pymysql://{user}:{pwd}@{host}:{port}/{db}'.format(user=Config.user, pwd=Config.password, host=Config.host, db=Config.database, port=Config.port)
        engine = create_engine(DB_CONN, echo=True)
        self.conn = engine.connect()

if __name__ == '__main__':
    db = DB()
    print(db.conn)

Google了下,没有找到答案. 于是上 IRC#python 频道询问,发现是因为自己的密码存在 特殊字符 导致的.
Sqlalchemy 是使用 database URL 来创建连接的, 如果密码含有特殊字符的话, 则会被转译, 从而导致服务端认证无法通过,报 Access denied for user 这样的 error.

修改代码, 防止密码中的特殊字符被转译

from urllib.parse import quote

from sqlalchemy import *

from config import Config

class DB:

    def __init__(self):
        '''初始化,连接数据库
        '''
        DB_CONN = 'mysql+pymysql://{user}:{pwd}@{host}:{port}/{db}'.format(user=Config.user, pwd=quote(Config.password), host=Config.host, db=Config.database, port=Config.port)
        engine = create_engine(DB_CONN, echo=True)
        self.conn = engine.connect()

if __name__ == '__main__':
    db = DB()
    print(db.conn)

ok, 连接成功.

shenxiaomei commented 4 years ago

同样的错误,成功的解决了问题,感谢!

LingjieLi commented 2 years ago

感谢