最近了解了一下django,数据库选用了mysql, 在连接数据库的过程中,遇到一点小问题,在这里记录一下,希望能够对遇到同样的问题的朋友有所帮助,少走一些弯路。关于django,想在这里也额外说一句。django是很优秀的基于python的web开发框架,对于有python基础的后台程序员,如果有要做一些前台的需求,强烈推荐django。下面言归正传。

    • 1. 问题的现象

下面是连接数据库的代码,用的是python的MySQLdb模块:

1
2
3
4
5
db = MySQLdb.connect(host='localhost',
port=3306,
user='root',
passwd='root98',
db='mysite')

下面是运行的时候报的错误:

1
2
3
4
5
6
7
Traceback (most recent call last):
File "./test_db.py", line 12, in < module>
db='mysite')
File "build/bdist.linux-x86_64/egg/MySQLdb/__init__.py", line 81, in Connect
File "build/bdist.linux-x86_64/egg/MySQLdb/connections.py", line 187, in __init__
 
_mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)")
    • 2. 问题原因分析

这里主要是因为我们连接mysql的时候,host用的是localhost, 实际用的是UNIX Domain Socket(具体见参考文献(1))来进行通信的。我们知道,UNIX Domain Socket的地址是一个socket类型的文件在文件系统中的路径,如果这个路径不存在的话,连接的时候就会失败。上面提示的错误原因是”Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)”,从字面意思上来看,是说无法通过’/var/lib/mysql/mysql.sock’这个socket来连接本地的mysql sever,这时候问题基本就比较明显了,应该是mysql配置的本地连接的socket不是’/var/lib/mysql/mysql.sock’这个路径的原因。接下来我们来验证我们的想法,打开mysql的配置文件(/etc/my.cnf),我们看到如下的内容:

1
2
3
4
5
6
7
8
9
10
11
12
# The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock
 
# The MySQL server
[mysqld]
bind-address = 10.12.22.98
port = 3306
socket = /tmp/mysql.sock
# ...

我们可以看到,本地mysql server配置的Unix Domain Socket是/tmp/mysql.sock,与上面python MySQLdb所用的不一样,这也印证了我们前面的猜想,找到了问题的原因。

    • 3. 解决问题的方法

知道了问题所在,我们就可以对症下药了,下面提供几种可以解决问题的方案:
(1)在python MySQLdb连接的时候,指定所用的unix_socket

1
2
3
4
5
6
db = MySQLdb.connect(host='localhost',
port=3306,
user='root',
passwd='root98',
db='mysite',
unix_socket='/tmp/mysql.sock')

(2)修改本地mysql server的UNIX Domain Socket

1
2
3
4
5
6
7
8
9
10
11
12
# The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3306
socket = /var/lib/mysql/mysql.sock
 
# The MySQL server
[mysqld]
bind-address = 10.12.22.98
port = 3306
socket = /var/lib/mysql/mysql.sock
# ...

(3)修改本地mysql server支持远程访问(具体见参考文献(2)),采用普通socket进行连接

1
2
3
4
5
db = MySQLdb.connect(host='10.12.22.98',
port=3306,
user='root',
passwd='root98',
db='mysite')
    • 4. 参考文献

(1)Unix Domain Socket
(2)mysql支持远程访问

参考文章:http://www.wuzesheng.com/?p=2234

python MySQLdb连接mysql失败(转载)的更多相关文章

  1. python MySQLdb连接mysql时报错

    故障现象: >>> import MySQLdb >>> conn = MySQLdb.connect(host=,charset="utf8" ...

  2. python -- MySQLdb连接mysql数据库

    1. python安装mysql $ pip install mysql-python 2. 数据库连接程序: import MySQLdb # 打开数据库连接db = MySQLdb.connect ...

  3. Python写入连接mysql失败

    执行如下连接数据库的语句: engine = create_engine('mysql://root:root@127.0.0.1/stock?charset=utf8') 报错如下: ImportE ...

  4. 使用Python编程语言连接MySQL数据库代码

    使用Python编程语言连接MySQL数据库代码,跟大家分享一下: 前几天我用python操作了mysql的数据库,发现非常的有趣,而且python操作mysql的方法非常的简单和快速,所以我把代码分 ...

  5. 通过python代码连接MySQL以及插入和显示数据

    通过python代码连接MySQL以及插入和显示数据: 数据库huahui创建一个shibie的表,里面有两个varcahr(100)的字段,num和result. import pymysql im ...

  6. 使用Navicat Premiun远程连接MySQL失败,报错(10038)

    远程连接MySQL失败,可能有一下原因: 1.小伙子/小姑凉注意一下你的ip是否输入正确了!! 2.网络或防火墙问题 1).排查网络问题 使用命令:ping 192.168.1.1 查看网络请求是否超 ...

  7. 用python连接mysql失败总结

    所用环境:python3,pycharm2018.2.4 先用mysql创建用户并授予相关权限 在我用python连接mysql时,一直提示连接不上,报错原因就是,用户没有被给予相关权限,比如查询,插 ...

  8. Mysqldb连接Mysql数据库(转)

    python操作mysql数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库 ...

  9. python如何连接mysql数据库

    先花点时间来说说一个程序怎么和数据库进行交互1.和数据库建立连接2.执行sql语句,接收返回值3.关闭数据库连接使用MySQLdb也要遵循上面的几步.让我们一步步的进行. 1.MySQL数据库要用My ...

随机推荐

  1. Mac 安装Minikube

    环境信息: guoguo-MacBook-Pro-3:~ guoguo$ docker versionClient: Version:    17.12.0-ce API version:    1. ...

  2. Sql Server 2005 .bak备份文进行还原数据库

    https://jingyan.baidu.com/article/9158e000250b91a25412283f.html https://www.cnblogs.com/webmen/p/575 ...

  3. Ubantu安装Odoo10学习日志

    Windows安装是十分简单的,无论是何种方式,在了解大体情况下,我开始尝试下将Odoo搭建部署在Ubantu上. 1.Odoo是什么? Odoo是一个开源框架,针对ERP的需求发展出来,适合定制出符 ...

  4. GAN综述

    生成式对抗模型GAN (Generativeadversarial networks) 是Goodfellow等[1]在 2014年提出的一种生成式模型,目前已经成为人工智能学界一个热门的研究方向,著 ...

  5. django用户信息扩展

    Django封装了好多东西,拿来用就可以了,帮我们封装类用户的登录认证,用户的表 所以Django自带有用户表,当扩展用户表后一些表就会被替换 用户认证相关的    功能放在django.contri ...

  6. 字符编码 and 字节和字符串转换(待补充)

    ascii用一个字节(8位二进制)代表一个字符 Unicode常用2个字节(16位二进制)代表一个字符,生僻字需要用四个字节 汉字中已经超出了ASCII编码的范围,用Unicode, Unicode兼 ...

  7. javascript;select动态添加和删除option

    <select id="sltCity"></select> //添加Option. var optionObj = new Option(text, va ...

  8. python 课堂笔记-if语句

    # Author:zyl _username = 'zyl' _password = 'zyl123' username = input("username:") password ...

  9. delphi 中 unicode 转汉字 函数

    近期用到这个函数,无奈没有找到 delphi 自带的,网上找了下 有类似的,没有现成的,我需要的是 支持 “\u4f00 ” 这种格式的,即前面带标准的 “\u”  于是改造了一下. 下面是 解码 函 ...

  10. 面向过程编程实例------grep-rl 'root 路径

    #应用:grep -rl 'root' /etc import os def deco(func): def wrapper(*args): g=func(*args) next(g) return ...