第一个问题:ModuleNotFoundError: No module named 'DBUtils'
用python写数据库连接时要用到数据连接池于是就想到了DBUtils ,这个简单 pip install DBUtile
安装完后写代码测试一下
from DBUtils.PooledDB import PooledDB
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named DBUtils.PooledDB
居然报错了!!!!!
pip list 查看一下
已经安装了呀
版本2.0可能是版本导致的
找到官网查看一下手册
webwareforpython.github.io/DBUtils/mai…
果然2.0的写法是
from dbutils.pooled_db import PooledDB
我的写法(是1.3的写法)
from DBUtils.PooledDB import PooledDB
解决方法:
使用 from dbutils.pooled_db import PooledDB
pip install DBUtils==1.3 重装1.3版本
第二个问题:MySQL source导入sql文件过慢,解决办法
博主100多万条数据,导了好久没有完成,看了mysql配置,设置之后基本能在几分钟完成。
mysql -u root -p -h 127.0.0.1
mysql>use test;
Database changed
mysql> set global innodb_flush_log_at_trx_commit=0;
Query OK, 0 rows affected (0.03 sec)
mysql> set global max_allowed_packet=1024*1024*20;
Query OK, 0 rows affected (0.00 sec)
mysql> set global bulk_insert_buffer_size=32*1024*1024;
Query OK, 0 rows affected (0.00 sec)
mysql> set global innodb_buffer_pool_size=32*1024*1024;
Query OK, 0 rows affected, 1 warning (0.09 sec)
mysql source /root/test.sql
上面设置的参数只在当前连接和新连接上生效
,永久生效请修改my.cnf。实际使用只会在连接上设置,这些参数在生产环境不适合使用,所以导入成功后请 重启使这些设置失效 。
shell mysql 客户端连接的时候出现
[root@localhost ~]# mysql -u root -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@localhost ~]#
这是安装的时候出现问题,只会在使用mysql客户端连接时出现,可以指定 -h 127.0.0.1 修改
mysql -u root -p -h 127.0.0.1
第三个问题:MySQL 连接出现 Authentication plugin 'caching_sha2_password' cannot be loaded
很多用户在使用Navicat Premium 12连接MySQL数据库时会出现Authentication plugin 'caching_sha2_password' cannot be loaded的错误。
出现这个原因是mysql8之前的版本中加密规则是mysql_native_password
,而在mysql8之后,加密规则是caching_sha2_password
一种是升级navicat驱动
一种是把mysql用户登录密码加密规则还原成mysql_native_password.
这里用第二种方式 ,解决方法如下
1. 管理员权限运行命令提示符
登陆MySQL(记得添加环境变量)
mysql -u root -p
password: #登入mysql
2. 修改账户密码加密规则并更新用户密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; #修改加密规则
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; #更新一下用户的密码
3. 刷新权限并重置密码
FLUSH PRIVILEGES; #刷新权限
上面两步对应的截图
单独重置密码命令:alter user 'root'@'localhost' identified by '111111';
现在再次打开Navicat Premium 12连接MySQL问题数据库就会发现可以连接成功了
第四个问题:解决MySQL外键约束中的引用列和引用列不兼容问题
初学MySQL,相信大家也绕了不少弯。通常会遇到MySQL外键约束中的引用列和引用列不兼容问题。
程序报错:
ERROR 3780 (HY000): Referencing column 'xxx' and referenced column 'xxx' in foreign key constraint 'xxxxxx' are incompatible.
外键约束中的引用列和引用列在编码格式上不同,导致不兼容报错。
这个的主要原因是我在设置外键的时候,对应的外键是主键,主键中我设置了自动递增和无符号,但是我用做外键的字段并没有进行设置,这样我们的两个字段的类型不一致,导致了最后的冲突
解决办法:
我们保持两个部分的统一即可,在设置外键的字段上,增加无符号属性
第五个问题:python的pymysql中以表名作为变量传递进查询语句中
在我们学习使用pymysql的时候有时需要把表名当做变量传递到sql语句中去执行,
然而我们的固定思维模式有时却限制了我们:
如:我们知道传递变量可以用占位符%s,后面加上变量就行,
在pymysql中也有同样的问题,我们在执行sql语句的时候可以把变量传递进去
sql = 'insert into TabName + ' value (%s %s)'
cursor.execute(sql, [name,age])
如果我们的TabName也是变量的话我们就会习惯性的这样加
sql = 'insert into %s + ' value (%s %s)'
cursor.execute(sql, [tabname,name,age])
然后这样报错了我们才知道这样不行,然后再去查原因,发现我们被自己的固定思维给限制住了(反正我是这样的)
我也是在网上找了半天再找到了解决办法,只要跳出这样的思维就行了
sql = 'insert into %s + ' value (%s %s)'
cursor.execute(sql, [tabname,name,age])
sql = 'insert into %s(name,age)' %TabName + ' value (%s)'
cursor.execute(sql, [name])
这样就没问题了,有时候我们是能解决这类似的问题的,但是我们却是往往被自己的固定思维给坑了!