第一个问题: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可能是版本导致的

找到官网查看一下手册

pypi.org/project/DBU…

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])

    这样就没问题了,有时候我们是能解决这类似的问题的,但是我们却是往往被自己的固定思维给坑了!

  • 私信
    2,971
  •