最近了解了一下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. 安装nginx包

    1.二进制安装源码包,直接输入yum stall nginx -y就可以 2,后面会涉及路径,所以先查下nginx的路径rpm -ql nginx 3,进入bin目录进行设置 4, 5,查看系统自带的 ...

  2. hive bin下的进入beeline 命令行和hive有什么不同?

    Hive 0.11中引入的HiveServer2有一个自己的CLI叫Beeline. HiveCLI现在已经过时,与Beeline相比,其缺少多用户.安全和其他与HiveServer2兼容的特性. 从 ...

  3. WebService中WSDL和WADL(转)

    转自https://blog.csdn.net/liuxiao723846/article/details/51611183#commentBox 自己加了修改批注方便自己理解. 1.Java开发We ...

  4. 《Python数据分析》笔记1 ——Numpy

    Numpy数组 1.Numpy数组对象 Numpy中的多维数组称为ndarray,他有两个组成部分. 1.数据本身 2.描述数据的元数据 2.Numpy的数值类型 bool: 布尔型 inti:其长度 ...

  5. C#数组实践

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cont ...

  6. 20160419 while练习,复习

    10 一.while和if题目练习 . 二.知识拓展 1. C#中的委托是什么?事件是不是一种委托? 答 :    委托可以把一个方法作为参数代入另一个方法.委托可以理解为指向一个函数的引用.     ...

  7. 运行docker image 忘记添加端口号

    docer inspect  容器id,查找IpAddress ,通过这个访问

  8. python Selenium库的使用

    一.什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行 ...

  9. 十位用户唯一ID生成策略

    新浪微博和twitter 等系统都有一窜数字ID来标示一个唯一的用户,这篇文章就是记录如何实现这种唯一数字ID 原理:使用MYSQL 自增ID 拼接任意字符..然后使用进制转换打乱规则 一般来说实现唯 ...

  10. 关于java登录界面

    import java.awt.*; 包含用于创建用户界面和绘制图形图像的所有类.   import javax.swing.*; 提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所 ...