Eclipse建立Django项目连接MySQL数据库报错,如图,请问该怎么解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Eclipse建立Django项目连接MySQL数据库报错,如图,请问该怎么解决?相关的知识,希望对你有一定的参考价值。

如题,就是我在Eclipse里面建立Django项目时,选择的是mysql数据库,之后运行数据库同步的时候报错,截图在下面,请前辈们指教该怎样修改?我是Python和Django的新手,请指教一下,谢谢!

错误代码 1045
Access denied for user 'root'@'localhost'
(using password:YES)

如果你的mysql也出现以上这种提示,
建议你逐个字看完我这篇文章再按以下方法来尝试解决问题.

这是mysql数据库很多时候出现的问题, 网上流传很多解决办法. 有人按照那些方法, 还真可以把问题解决了; 但也有很多人按那些方法解决不了问题!
而这个中原因, 就是没有对症下药!!!

网上的那些方法, 很多都没有明确指出是什么版本的mysql, 所以导致问题者不能对症下药.

出现这个问题, 通过停止/重启 mysql 服务, 是可以解决的, 这个是最简单的办法! 对于不懂得什么叫做"停止/重启mysql服务"的人来说,
这个最简单的办法就是把服务器主机进行重新启动(就是把你的电脑进行重新启动).

以上是方法A! (这个方法适合任何版本的mysql)

以下是方法B:(方法仅适用于MySQL4.0.26 版本!!! (我估计,
4.0的其他版本应该也可以的))

网上也有说, 就是对root进行重改密码. 对于网上流传的改密码方法, 也是可行的. 请参考以下:

DOS下修改ROOT密码:当然后面安装phpMYADMIN后修改密码也可以通过PHPMYADMIN修改

格式:mysqladmin -u用户名 -p旧密码 password
新密码

例:给root加个密码ideacmblog

首先在进入CMD命令行,转到MYSQL目录下的bin目录,然后键入以下命令

mysqladmin
-uroot password ideacmblog

注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。

D:\php\MySQL\bin>mysqladmin -uroot password
ideacmblog回车后ROOT密码就设置为ideacmblog了

但是, 请注意了, 以上方法仅适用于MySQL4.0.26
版本!!! (我估计, 4.0的其他版本应该也可以的)

方法C:

好了, 扯了那么多, 以上的两个方法都不是我本人测试过的, 本人不对真实性负责!

而现在我说一下本人亲自试过的方法, 以供参考:

话说今天, 我的服务器所有php及使用了mysql数据库的网站, 均挂掉了! 无法打开,
并有以下提示:

错误代码 1045
Access denied for
user 'root'@'localhost' (using password:YES)

一开始我也是不断搜索google(我本人不喜欢百度!),
去找寻解决的办法. 看了很多, 也参照执行了, 事实上也是解决不了问题. 后来我想到了是版本的问题, 不同的mysql版本,
解决办法是不一定一样的!!记住...

我的mysql版本是: 5.0.22
(mysql-essential-5.0.22-win32)

今天一整天, 那些php网站均罢工. 到今晚才有时间上去服务器继续寻找方法, 但仍然解决不了.

最后, 我决定把mysql卸掉重新安装!

卸载很快, 而且不需要重新启动计算机.

于是, 继续进行安装.

第一步:
打开这个mysql-essential-5.0.22-win32.exe文件;

第二步: 见到窗口弹出, 并点击 Next>
进入下一步;

第三步: 选择 Custom 项, 并点击
Next> 进入下一步;

第四步: 到这一步要注意了, 点击
Change... 选择你原安装mysql的目录; 选择后, 继续点击Next> 进入下一步;

第五步: 点击 Install
进行安装...

安装至下一步, 会提示你进行注册, 选择最后一项, 即跳过注册,
进入下一步正式完成安装.

安装完成后, 继续弹出一个窗口, 提示你是不是立刻进行配置,
选择 Next

选择Standard Configuration.继续点击
Next 进入下一步

这一步里, 把上面那行的勾去掉, 只在 Include
....PATH 那行打勾, 继续点击 Next 进入下一步

在这一步, 点击中间的"Ex****"那顶,
接着配置完毕!

这时候, 你去看看你的mysql正常了没有??
!!

这样就ok了!!!
参考技术A 检查一下数据库权限和系统权限或者密码. 参考技术B 可能数据库权限或系统权限问题. 参考技术C 密码写错了吧?。。。追问

没有啊,密码没错啊

追答

Jar包有没有加对,加全?

django 重写 mysql 连接库实现连接池

django 重写 mysql 连接库实现连接池

问题

django 项目使用 gunicorn + gevent 部署,并设置 CONN_MAX_AGE 会导致 mysql 数据库连接数飙升,在高并发模式可能会出现 too many connections 错误。该怎么解决这个问题呢?首先看下 django 源码,找到问题的根源。

本文 django 版本为 2.2.3。

问题分析

首先查看连接部分源码:

# django/db/backends/mysql/base.py

class DatabaseWrapper(BaseDatabaseWrapper):
    vendor = 'mysql'
    ...
    ...
    ...
    def get_new_connection(self, conn_params):
        # 每次查询都会重新建立连接
        return Database.connect(**conn_params)
    ...
    ...
    ...

再查看其基类 BaseDatabaseWrapper

# django/db/backends/base/base.py

class BaseDatabaseWrapper:
    """Represent a database connection."""
    # Mapping of Field objects to their column types.
    data_types = {}
    ...
    ...
    ...

    def _close(self):
        if self.connection is not None:
            with self.wrap_database_errors:
                # 每次查询完又要调用 close 关闭连接
                return self.connection.close()
    ...
    ...
    ...

查看源码发现 django 连接 mysql 时没有使用连接池,导致每次数据库操作都要新建新的连接并查询完后关闭,更坑的是按照 django 的官方文档设置 CONN_MAX_AGE 参数是为了复用连接,然后设置了 CONN_MAX_AGE 后,每个新连接查询完后并不会 close 掉,而是一直在那占着。

问题解决

通过重写 django 官方 mysql 连接库实现连接池解决。

settings.py 配置


...
DATABASES = {
    'default': {
        'ENGINE': 'db_pool.mysql',     # 重写 mysql 连接库实现连接池
        'NAME': 'devops',
        'USER': 'devops',
        'PASSWORD': 'devops',
        'HOST': '192.168.223.111',
        'PORT': '3306',
        'CONN_MAX_AGE': 600,
        # 数据库连接池大小,mysql 总连接数大小为:连接池大小 * 服务进程数
        'DB_POOL_SIZE': 20,     # 默认 5 个
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
         },
    }
}
...

目录结构

db_pool/
├── __init__.py
└── mysql
    ├── base.py
    └── __init__.py
  • db_pool 位于 django 项目根目录

base.py

# -*- coding: utf-8 -*-
import random
from django.core.exceptions import ImproperlyConfigured

try:
    import MySQLdb as Database
except ImportError as err:
    raise ImproperlyConfigured(
        'Error loading MySQLdb module.
'
        'Did you install mysqlclient?'
    ) from err

from django.db.backends.mysql.base import *
from django.db.backends.mysql.base import DatabaseWrapper as _DatabaseWrapper

DEFAULT_DB_POOL_SIZE = 5


class DatabaseWrapper(_DatabaseWrapper):
    def get_new_connection(self, conn_params):
        # 获取 DATABASES 配置字典中的 DB_POOL_SIZE 参数
        pool_size = self.settings_dict.get('DB_POOL_SIZE') or DEFAULT_DB_POOL_SIZE
        return ConnectPool.instance(conn_params, pool_size).get_connection()

    def _close(self):
        return None  # 覆盖掉原来的 close 方法,查询结束后连接不会自动关闭


class ConnectPool(object):
    def __init__(self, conn_params, pool_size):
        self.conn_params = conn_params
        self.pool_size = pool_size
        self.connects = []

    # 实现连接池的单例
    @staticmethod
    def instance(conn_params, pool_size):
        if not hasattr(ConnectPool, '_instance'):
            ConnectPool._instance = ConnectPool(conn_params, pool_size)
        return ConnectPool._instance

    def get_connection(self):
        if len(self.connects) < self.pool_size:
            new_connect = Database.connect(**self.conn_params)
            self.connects.append(new_connect)
            return new_connect
        index = random.randint(0, self.pool_size - 1)   # 随机返回连接池中的连接
        try:
            # 检测连接是否有效,去掉性能更好,但建议保留
            self.connects[index].ping()
        except Exception:
            self.connects[index] = Database.connect(**self.conn_params)
        return self.connects[index]

总结

利用连接池 + 假关闭的方式解决过高连接数的问题。

以上是关于Eclipse建立Django项目连接MySQL数据库报错,如图,请问该怎么解决?的主要内容,如果未能解决你的问题,请参考以下文章

django 重写 mysql 连接库实现连接池

django 和 mysql 啥是“最大连接数”?

Django连接与建立数据库

eclipse中的MySql(MAMP)jdbc连接错误

sql连接建立方式

eclipse 连接 mysql