Django系列---使用MySql数据库

目录

  • 1. 创建数据库

    • 1.1. 使用utf8mb4编码

      • 1.1.1. 确定mysql的配置文件
      • 1.1.2. 修改配置文件
      • 1.1.3. 重启数据库服务,检查相关字段
      • 1.1.4. 新建数据库
    • 1.2. 使用已经存在的数据库
      • 1.2.1. 修改已有数据库的编码
    • 1.3. 为Django项目新建一个数据库用户
  • 2. 修改Django的配置
    • 2.1. 修改settings.py中数据库相关
    • 2.2. 安装mysqlclient
      • 2.2.1. 安装mysql-connector-c
      • 2.2.2. 修复mysql-connector-c在mac os的python3的bug
      • 2.2.3. 安装mysqlclient
    • 2.3. 执行migrate操作
    • 2.4. 创建一个管理员用户
  • 3. 拓展阅读

Django默认使用的sqlite3,这在实际的生产环境中是不推荐的;

1. 创建数据库

Linux VM_0_15_centos 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

1.1. 使用utf8mb4编码

mysql的utf-8编码最多只支持3个字节,而移动端的一些表情都是以4个字节存储的;utf8mb4是一个替代的方案,建议创建数据库和表都以utf8mb4替代utf-8

1.1.1. 确定mysql的配置文件

# 系统中my.cnf文件的位置
[[email protected]_0_15_centos ~]$ locate my.cnf
/etc/my.cnf
/etc/my.cnf.d
/etc/my.cnf.d/client.cnf
/etc/my.cnf.d/mysql-clients.cnf
/etc/my.cnf.d/server.cnf

# mysql启动时,读取配置文件的目录顺序
[[email protected]_0_15_centos ~]$ mysql --help | grep 'my.cnf'
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,

1.1.2. 修改配置文件

/etc/my.cnf

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

1.1.3. 重启数据库服务,检查相关字段

# 保证character_set_client、character_set_connection、character_set_database、character_set_results和character_set_server的值一定是utf8mb4
MariaDB [(none)]> SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
| collation_connection     | utf8mb4_unicode_ci         |
| collation_database       | utf8mb4_unicode_ci         |
| collation_server         | utf8mb4_unicode_ci         |
+--------------------------+----------------------------+
11 rows in set (0.02 sec)

1.1.4. 新建数据库

MariaDB [(none)]> create database blogproject;
Query OK, 1 row affected (0.01 sec)

--查看blogproject创建时候使用的编码,回显中注释的部分可以看出,使用的是utf8mb4编码
MariaDB [mysql]> show create database blogproject;
+-------------+----------------------------------------------------------------------------------------------------+
| Database    | Create Database                                                                                    |
+-------------+----------------------------------------------------------------------------------------------------+
| blogproject | CREATE DATABASE `blogproject` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ |
+-------------+----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

1.2. 使用已经存在的数据库

1.2.1. 修改已有数据库的编码

MariaDB [(none)]> alter database blogproject character set utf8mb4;

1.3. 为Django项目新建一个数据库用户

-- 赋予这个新用户增删改查等权限,不授予drop的权限;并且,只允许本地客户端登陆;
MariaDB [mysql]> grant alter,create,delete,index,insert,select,update,trigger on blogproject.* to <用户名>@localhost identified by '<密码>';
Query OK, 0 rows affected (0.04 sec)

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.03 sec)

-- 检查权限,秘密默认是加密存储
MariaDB [blogproject]> show grants for <用户名>@localhost;
+----------------------------------------------------------------------------------------------------------------+
| Grants for <用户名>@localhost                                                                                    |
+----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO '<用户名>'@'localhost' IDENTIFIED BY PASSWORD '*5102144CA406FC026831D796EA07645447677551'  |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, ALTER, TRIGGER ON `blogproject`.* TO '<用户名>'@'localhost' |
+----------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

2. 修改Django的配置

2.1. 修改settings.py中数据库相关

DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'blogproject',
        'USER': '<用户名>',
        'PASSWORD': '<用户名>',
        'HOST': '<数据库服务器的IP>',
        'PORT': '3306',  # 默认的服务端口号
        'OPTIONS': {
            # 存储引擎启用严格模式,非法数据值被拒绝
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            'charset': 'utf8mb4',
        },
    }
}

2.2. 安装mysqlclient

Darwin luizyaodeMacBook-Air.local 18.6.0 Darwin Kernel Version 18.6.0: Thu Apr 25 23:16:27 PDT 2019; root:xnu-4903.261.4~2/RELEASE_X86_64 x86_64

2.2.1. 安装mysql-connector-c

luizyaodeMacBook-Air:~ luizyao$ brew install mysql-connector-c
==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/bottles/mysql-conne
######################################################################## 100.0%
==> Pouring mysql-connector-c-6.1.11.mojave.bottle.tar.gz
??  /usr/local/Cellar/mysql-connector-c/6.1.11: 79 files, 15.3MB

2.2.2. 修复mysql-connector-c在mac os的python3的bug

/usr/local/Cellar/mysql-connector-c/6.1.11/bin/mysql_config

# Create options
libs="-L$pkglibdir"
libs="$libs -l "

修改为

# Create options
libs="-L$pkglibdir"
libs="$libs -lmysqlclient -lssl -lcrypto"

2.2.3. 安装mysqlclient

2.2.3.1. 使用pip安装

[luizyaodeMacBook-Air:django-blog luizyao$ pip3 install mysqlclient

2.2.3.2. 使用pipenv安装

这个时候会报错,因为:because Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries.

luizyaodeMacBook-Air:django-blog luizyao$ brew info openssl
openssl: stable 1.0.2s (bottled) [keg-only]
SSL/TLS cryptography library
https://openssl.org/
/usr/local/Cellar/openssl/1.0.2s (1,795 files, 12.0MB)
  Poured from bottle on 2019-06-22 at 13:16:17
From: https://mirrors.ustc.edu.cn/homebrew-core.git/Formula/openssl.rb
==> Caveats
A CA file has been bootstrapped using certificates from the SystemRoots
keychain. To add additional certificates (e.g. the certificates added in
the System keychain), place .pem files in
  /usr/local/etc/openssl/certs

and run
  /usr/local/opt/openssl/bin/c_rehash

openssl is keg-only, which means it was not symlinked into /usr/local,
because Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries.

If you need to have openssl first in your PATH run:
  echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile

For compilers to find openssl you may need to set:
  export LDFLAGS="-L/usr/local/opt/openssl/lib"
  export CPPFLAGS="-I/usr/local/opt/openssl/include"

==> Analytics
install: 490,905 (30 days), 1,748,362 (90 days), 6,591,368 (365 days)
install_on_request: 59,162 (30 days), 234,123 (90 days), 884,807 (365 days)
build_error: 0 (30 days)

根据提示做如下操作

luizyaodeMacBook-Air:django-blog luizyao$ echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile
luizyaodeMacBook-Air:django-blog luizyao$ source ~/.bash_profile
luizyaodeMacBook-Air:django-blog luizyao$ export LDFLAGS="-L/usr/local/opt/openssl/lib"
luizyaodeMacBook-Air:django-blog luizyao$ export CPPFLAGS="-I/usr/local/opt/openssl/include"

再安装mysqlclient,就能成功了

luizyaodeMacBook-Air:django-blog luizyao$ pipenv install mysqlclient
Installing mysqlclient…
Adding mysqlclient to Pipfile's [packages]…
? Installation Succeeded
Pipfile.lock (cee3a5) out of date, updating to (79d06d)…
Locking [dev-packages] dependencies…
? Success!
Locking [packages] dependencies…
? Success!
Updated Pipfile.lock (cee3a5)!
Installing dependencies from Pipfile.lock (cee3a5)…
  ??   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 4/4 — 00:00:01
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.

2.3. 执行migrate操作

[luizyaodeMacBook-Air:django-blog luizyao$ pipenv run python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying blog.0001_initial... OK
  Applying sessions.0001_initial... OK

只有Applying blog.0001_initial... OK是和我们自己模型相关的,其他的是Django系统自带的一些模型, 我们可以进一步的查看数据库到底做了什么操作;

luizyaodeMacBook-Air:django-blog luizyao$ pipenv run python manage.py sqlmigrate blog 0001
BEGIN;
--
-- Create model Category
--
CREATE TABLE `blog_category` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(100) NOT NULL);
--
-- Create model Tag
--
CREATE TABLE `blog_tag` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(100) NOT NULL);
--
-- Create model Post
--
CREATE TABLE `blog_post` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `title` varchar(70) NOT NULL, `excerpt` varchar(200) NOT NULL, `body` longtext NOT NULL, `created_at` datetime(6) NOT NULL, `modified_at` datetime(6) NOT NULL, `author_id` integer NOT NULL, `category_id` integer NOT NULL);
CREATE TABLE `blog_post_tag` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `post_id` integer NOT NULL, `tag_id` integer NOT NULL);
ALTER TABLE `blog_post` ADD CONSTRAINT `blog_post_author_id_dd7a8485_fk_auth_user_id` FOREIGN KEY (`author_id`) REFERENCES `auth_user` (`id`);
ALTER TABLE `blog_post` ADD CONSTRAINT `blog_post_category_id_c326dbf8_fk_blog_category_id` FOREIGN KEY (`category_id`) REFERENCES `blog_category` (`id`);
ALTER TABLE `blog_post_tag` ADD CONSTRAINT `blog_post_tag_post_id_a5c00319_fk_blog_post_id` FOREIGN KEY (`post_id`) REFERENCES `blog_post` (`id`);
ALTER TABLE `blog_post_tag` ADD CONSTRAINT `blog_post_tag_tag_id_2bbd31e4_fk_blog_tag_id` FOREIGN KEY (`tag_id`) REFERENCES `blog_tag` (`id`);
ALTER TABLE `blog_post_tag` ADD CONSTRAINT `blog_post_tag_post_id_tag_id_ba2a5f83_uniq` UNIQUE (`post_id`, `tag_id`);
COMMIT;

在数据库中可以看到Django创建的具体表;

MariaDB [blogproject]> show tables;
+----------------------------+
| Tables_in_blogproject      |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| blog_category              |
| blog_post                  |
| blog_post_tag              |
| blog_tag                   |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
14 rows in set (0.00 sec)

2.4. 创建一个管理员用户

luizyaodeMacBook-Air:django-blog luizyao$ pipenv run python manage.py createsuperuser
用户名 (leave blank to use 'luizyao'): luizyao
电子邮件地址: [email protected]
Password:
Password (again):
Superuser created successfully.

在数据库中,我们就可以看到这个管理员用户了

MariaDB [blogproject]> select * from auth_user;
+----+--------------------------------------------------------------------------------+------------+--------------+----------+------------+-----------+-----------------+----------+-----------+----------------------------+
| id | password                                                                       | last_login | is_superuser | username | first_name | last_name | email           | is_staff | is_active | date_joined                |
+----+--------------------------------------------------------------------------------+------------+--------------+----------+------------+-----------+-----------------+----------+-----------+----------------------------+
|  1 | pbkdf2_sha256$150000$ViP2waofsEQU$3oNPdGxlGPmt5Nbl/lcHJli8V9j7425ZxRfqKF18E0Q= | NULL       |            1 | luizyao  |            |           | [email protected] |        1 |         1 | 2019-08-25 03:49:19.667011 |
+----+--------------------------------------------------------------------------------+------------+--------------+----------+------------+-----------+-----------------+----------+-----------+----------------------------+
1 row in set (0.00 sec)

3. 拓展阅读

原文地址:https://www.cnblogs.com/luizyao/p/11407523.html

时间: 2024-10-04 01:41:25

Django系列---使用MySql数据库的相关文章

1Python全栈之路系列之MySQL数据库基本操作

Python全栈之路系列之MySQL数据库基本操作 MySQL数据库介绍 MySQL是一种快速易用的关系型数据库管理系统(RDBMS),很多企业都在使用它来构建自己的数据库. MySQL由一家瑞典公司MySQL AB开发.运营并予以支持.它之所以非常流行,原因在于具备以下这些优点: 基于开源许可发布,无需付费即可使用. 自身的功能非常强大,足以匹敌绝大多数功能强大但却价格昂贵的数据库软件. 使用业内所熟悉的标准SQL数据库语言. 可运行于多个操作系统,支持多种语言,包括 PHP.PERL.C.C

django 中连接mysql数据库的操作步骤

django中连接mysql数据库的操作步骤: 1 settings配置文件中 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'orm02', # 库的名字 'USER':'root', # 数据库的用户名 'PASSWORD':'666', # 数据库的密码 'HOST':'127.0.0.1', 'PORT':3306, } } 2 项目文件夹下的init文件中写上下面内容,用pymysql替

django配置使用mysql数据库运行报错:django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named &#39;MySQLdb&#39;

今天在把django的默认数据库sqlite3切换为MySQL数据库时报错:django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb' 报错原因:django虚拟环境没有安装pymysql模块 解决: 先安装pymysql:pip install pymysql 然后在项目的 init.py 文件中添加以下代码: 把django的默认数据库sqlite3切

在 Django 中构建 mysql 数据库支持的 Web 应用程序(linux )

运行: python 若出错说明系统没有按装python否则可越过安装python这步安装python下载 wget http://python.org/ftp/python/2.7/Python-2.7.tar.bz2 tar -jxvf Python-2.7.tar.bz2 cd Python-2.7 ./configure make all make install 安装Django下载 wget https://www.djangoproject.com/m/releases/1.8/D

Pycharm中的Django项目连接mysql数据库

一.安装Pycharm和Django就不详细说了,自行百度 二.新建Django项目也不说了 三.配置Django连接到mysql 1.models.py写一个类,继承models.Model class Book(models.Model): name=models.CharField(max_length=20) price=models.IntegerField() pub_date=models.DateField() 2.修改settings.py文件 DATABASES = { 'd

如何在Django中配置MySQL数据库

直接上图 在项目中直接找到settings 文件 第一步       原始Django自带数据库 第二步将配置改成MySQL的数据 第三步  在__init__文件中告知Django使用MySQL数据库 第四步   连接MySQL 第五步  填写添加数据库必须填写的内容 然后就连上了数据库 原文地址:https://www.cnblogs.com/tangda/p/10740793.html

Django下使用mysql数据库

1. 安装 pymysql 包用作 python 和 mysql 的接口$ sudo pip3 install pymysql安装 mysql 客户端 ( 非必须 ) $ sudo pip3 install mysqlclient 2.创建 和 配置数据库1. 创建数据库创建 create database 数据库名 default charset utf8 collate utf8_general_ci;create database mywebdb default charset utf8

服务器重启后 django无法连接mysql数据库的解决方法

问题描述: 远程linux服务器,centOS7系统 采用uwsgi+django+pymysql的方式连接mysql数据库. 在服务器重启之后, 启用uwsgi之后(直接运行django运行命令也是一样python manage.py runserver), 无法连接到数据库. 报错: cryptography is required for sha256_password or caching_sha2_password 解决方法: 1. 手动连接数据库一次 mysql -u root -p

Django 中配置MySQL数据库

在Django的项目中会默认使用sqlite的数据库 配置MySQL需要在setting.py 里加入以下设置: 配置数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '数据库名', 'USER': '用户名', 'PASSWORD': '数据库密码', 'HOST': '数据库主机,留空默认为localhost', 'PORT': '端口号', } } 在_init_.py文件中写入两行代码