【问题标题】:sqlalchemy OperationalError: (OperationalError) (1045, "Access denied for usersqlalchemy OperationalError: (OperationalError) (1045, "Access denied for user
【发布时间】:2021-09-25 17:19:34
【问题描述】:

我正在尝试在运行 12.04 的 Ubuntu 机器上使用 mysql 创建一个远程数据库。

它有一个启用远程登录的root用户。我已经启动了服务器。

输出

sudo netstat -tap | grep mysql

显示

tcp        0      0 *:mysql                 *:*                     LISTEN      13135/mysqld 

在同样运行 Ubuntu 12.04 的客户端机器上,我使用 python 脚本使用 sqlalchemy 连接到远程 mysql 数据库。

from pox.core import core
import pox.openflow.libopenflow_01 as of
import re
import datetime
import time
from sqlalchemy import create_engine, ForeignKey
from sqlalchemy import Column, Date, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.sql.expression import exists

log = core.getLogger()

engine = create_engine('mysql://root:pass@192.168.129.139/home/karthik.sharma/ms_thesis/nwtopology.db', echo=False)

Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()

class SourcetoPort(Base):
    """"""
    __tablename__ = 'source_to_port'
    id = Column(Integer, primary_key=True)
    port_no        = Column(Integer)
    src_address    = Column(String,index=True)

    #-----------------------------------------
    def __init__(self, src_address,port_no):
        """"""
        self.src_address = src_address
        self.port_no     = port_no

create_engine() 调用失败并出现以下错误。

  return dialect.connect(*cargs, **cparams)
  File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 280, in connect
    return self.dbapi.connect(*cargs, **cparams)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/__init__.py", line 81, in Connect
    return Connection(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 187, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
OperationalError: (OperationalError) (1045, "Access denied for user 'root'@'openflow.ems.com' (using password: YES)") None None

我无法弄清楚为什么会发生这种情况?非常感谢任何帮助?

【问题讨论】:

    标签: python mysql sqlalchemy


    【解决方案1】:

    首先,mysql 不喜欢你的 root 用户密码。

    您的连接 URI 的 root 用户密码为 pass

    engine = create_engine('mysql://root:pass@192.168.129.139/home/karthik.sharma/ms_thesis/nwtopology.db', echo=False)
    

    所以你需要做的是配置root用户密码,并授予从你的应用程序运行的主机到db服务器和应用程序的访问权限。这里是step by step guide for doing this

    有一种方法可以从命令行以 root 用户身份访问 mysql db,方法是在运行 mysql 服务器的同一台服务器上运行命令 mysql -u root -p。默认情况下,mysql 配置为允许 root 用户从 localhost 使用空密码登录。

    请尝试配置 mysql 数据库访问权限,如果有任何问题,请随时将您的问题发布到 stackoverflow。

    mysql URI 也将look 略有不同:

    'mysql://root:pass@192.168.129.139/nwtopology'
    

    【讨论】:

    • 看来你的意思是必须先创建数据库本身(nwtopology),然后我才能使用 sqlalchemy 中的 create_engine()。我最初有一个使用 sqlite 的本地数据库,它在其中创建数据库如果不存在,它会打开现有的数据库。我想我是在这种思维模式下。
    • 你是对的——你需要从头开始在 mysql 中创建新的数据库。你是如何创建你的 sqlite 数据库的?你有create table... 查询吗?还是您使用 SQLAlchemy 创建表?
    • 我创建了一个新数据库并按照您建议的链接进行操作。现在我收到新错误:(我为此创建了一个新问题。stackoverflow.com/questions/16472175/…
    • 为什么需要密码?为什么我不能将其留空以进行测试和调试?为什么要搞得这么复杂?为什么只是为什么。它是我的根,我应该有控制权吗?
    【解决方案2】:

    我认为mysql用户'root'@'openflow.ems.com'没有访问权限,你可以试试:

    GRANT ALL on *.* to 'root'@'openflow.ems.com';
    FLUSH PRIVILEGES;
    

    【讨论】:

    • 这是在开玩笑吗?
    【解决方案3】:

    供其他人参考 - 如果您在正确配置访问权限的情况下仍遇到此问题,原因可能是您的密码包含特殊字符。特殊字符必须经过 URL 编码。

    在 Python 3.x 中,这可以使用 urllib 库来完成:

    import urllib
    db_password = "!my@pa$sword%"
    db_password_quoted = urllib.parse.quote(db_password)
    print(db_password_quoted)
    >> %21my%40pa%24sword%25
    

    然后将db_password_quoted 传递给连接/引擎而不是原始密码。

    【讨论】:

      猜你喜欢
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 2017-04-19
      • 1970-01-01
      • 2021-05-14
      相关资源
      最近更新 更多