• 114-解决mysqlclient安装失败,及django使用mysql的一个天坑


    安装好MySQL之后,直接用Python进行操作是可以的,假设要在django中使用mysql,还需要安装pymysql,话不多说,直接安装:

    pip3 install pymysql --user
    

     安装完之后,在setting进行如下配置:

    1、首先在django工程的setting.py里,引入pymysql:

    import os
    import pymysql
    pymysql.install_as_MySQLdb()
    

    2、接着,在mysql里创建一个数据库,用来存储django里要存取的表格:

    lzh@lzh-pc:~$ mysql -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 9
    Server version: 8.0.17 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql> CREATE DATABASE test_app CHARACTER SET utf8;
    Query OK, 1 row affected, 1 warning (0.01 sec)
    
    mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | test_app           |
    +--------------------+
    5 rows in set (0.00 sec)
    

    3、最后,配置django工程里的setting.py的database部分。其中name是在mysql里定义的某个数据库名:

    # Database
    # https://docs.djangoproject.com/en/2.2/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'test_app',
            'USER': 'root',
            'PASSWORD': '19830427',
            'HOST': 'localhost',
            'PORT': '3306',
        }
    }
    

    4、高能预警!

    此时无论是直接runserver,还是makemigrations,都会报错,大致是:

        raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
    django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
    

    但是请注意,如果用pip3 list查看,是根本没有mysqlclient这个包的,一定会有人想,如果没有这个包(或者版本太低),装一下不就行了。

    5、安装mysqlclient,官网上列举了这些前置需求:

    sudo apt-get install python3-dev

    sudo apt-get install default-libmysqlclient-dev

    如果把这两个安装完成后,再安装mysqlclient,仍然会报错,而且会报错一整屏幕红字,非常惊悚,仔细一看,主要是这里的问题:

    /usr/bin/ld: 找不到 -lssl 
    /usr/bin/ld: 找不到 -lcrypto
    

     安装其中一个即可:sudo apt-get install libssl-dev

    【注意是libssl,少一个l】

    到这里,就能正常安装mysqlclient了,使用命令:pip3 install mysqlclient --user

    然后再用pip3 list就能查看到:

    mysqlclient           1.4.4 

    到了这里,你以为问题解决了,然后能愉快地运行runserver或makemigrations?非常遗憾!

    仍然会报错:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

    这就不是版本的问题了,而是它永远都会出错!!!

      File "/home/lzh/.local/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 36, in <module>
        raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
    django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
    

    6、大部分的人(网上看到的各种笔记,blog,经验分享)都是选择直接跳过这个错误,方法是编辑报错文件:gedit /home/yourusername/.local/lib/python3.6/site-packages/django/db/backends/mysql/base.py

    将以下两行注释掉:

    # if version < (1, 3, 13):
    #     raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
    

    尝试运行runserver或makemigrations,仍然出错:

      File "/home/lzh/.local/lib/python3.6/site-packages/django/db/backends/mysql/operations.py", line 146, in last_executed_query
        query = query.decode(errors='replace')
    AttributeError: 'str' object has no attribute 'decode'
    

     解决这个报错的方法是:gedit /home/lzh/.local/lib/python3.6/site-packages/django/db/backends/mysql/opetions.py

    将decode改为encode,代码为:

        def last_executed_query(self, cursor, sql, params):
            # With MySQLdb, cursor objects have an (undocumented) "_executed"
            # attribute where the exact query sent to the database is saved.
            # See MySQLdb/cursors.py in the source distribution.
            query = getattr(cursor, '_executed', None)
            if query is not None:
                query = query.encode(errors='replace')
            return query
    

    7、后记

    安装了MySQL,然后安装了pymysql,就直接开始使用的,当报错时直接使用《6》的方法解决即可,个人怀疑是检查兼容性的代码有bug;

    实际上,在bug没有解决前,费劲心思安装mysqlclient一点用处没有!

    8、验证django使用mysql

    (1)使用python3 manage.py createsuperuser创建超级管理员

    (2)进入admin后台,添加一个guest:guest_name=刘振华,guest_title=先生

    (3)查看mysql是否有对应内容

    lzh@lzh-pc:~$ mysql -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 30
    Server version: 8.0.17 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql> USE test_app;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> SHOW TABLES;
    +----------------------------+
    | Tables_in_test_app         |
    +----------------------------+
    | auth_group                 |
    | auth_group_permissions     |
    | auth_permission            |
    | auth_user                  |
    | auth_user_groups           |
    | auth_user_user_permissions |
    | django_admin_log           |
    | django_content_type        |
    | django_migrations          |
    | django_session             |
    | test_app_cnbcontent        |
    | test_app_cnbtitle          |
    | test_app_guestmodel        |
    +----------------------------+
    13 rows in set (0.00 sec)
    
    mysql> select * from test_app_guestmodel;
    +----+------------+-------------+
    | id | guest_name | guest_title |
    +----+------------+-------------+
    |  1 | 刘振华     | 先生        |
    +----+------------+-------------+
    1 row in set (0.00 sec)
    
  • 相关阅读:
    php 正则获取字符串中的汉字(去除字符串中除汉字外的所有字符)
    发送短信倒计时效果实现
    《JavaScript模式》第2章 基本技巧
    《JavaScript模式》第1章 简介
    点击元素,只有它的背景变色
    笔试题之优化代码
    jQuery实现一个全选复选框联动效果
    《深入浅出Node.js》第3章 异步I/O
    《深入浅出Node.js》第2章 模块机制
    《深入浅出Node.js》第1章 Node简介
  • 原文地址:https://www.cnblogs.com/lzhshn/p/11439021.html
Copyright © 2020-2023  润新知