mariadb相关知识
-
mariadb安装1、安装MariaDB安装命令yum -y install mariadb mariadb-server安装完成MariaDB,首先启动MariaDBsystemctl start mariadb设置开机启动systemctl enable mariadb接下来进行MariaDB的相关简单配置mysql_secure_installation首先是设置密码,会提示先输入密码Enter current password for root (enter for none):<–初次运行直接回车设置密码Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车New password:<– 设置root用户的密码Re-enter new password: <– 再输入一次你设置的密码其他配置Remove anonymous users? [Y/n] <– 是否删除匿名用户,回车Disallow root l
-
mariadb install on Ubuntu 16.04.1 LTS最近在尝试基于Ubuntu 16.04.1 LTS server 部署openstack ,在部署的过程中遇到mariadb 无法正常链接。问题参照openstack 官方文档安装mariadb,安装后遇到无法在本地登录的问题$mysql -u root -p$mysql -h localhost -u root -p报错如下mysql (mariadb) ERROR 1698 (28000): Access denied for user 'root'@'localhost'但使用如下方式却可以登录$sudo mysql -u root遂卸载mariadb,但卸载方式比较暴力,导致再次安装时报出类似如下错误dpkg: warning: while removing mariadb-server-core-10.0, directory '/usr/share/mysql' not empty so not removeddpkg: error process
-
Ansible的MariaDB部署1. 安装Ansible工具安装Ansible工具[root@test01 ~]# cat /etc/centos-releaseCentOS Linux release 7.4.1708 (Core) [root@test01 ~]# yum install ansible -y配置Ansible工具[root@test01 ~]# cat /etc/ansible/hosts [mariadb]192.168.1.31[mariadb:vars] ansible_ssh_pass='123456'# 修改两个参数[root@test01 ~]# vim /etc/ansible/ansible.cfggathering = explicithost_key_checking = False测试Ansible工具[root@test01 ~]# ansible mariadb -m ping -o192.168.1.31 | SUCCESS => {"changed": false, "ping":
-
如何在Ubuntu 14.04 LTS上安装MariaDBMariaDB是一个开源数据库且100%与MySQL兼容,目标是替代MySQL数据库。MariaDB的背景 :2008年,MySQL被后来被Oracle在2010年收购的Sun Microsystems收购了。 最初被Sun公司的收购由于符合项目的需要而受到MySQL社区的欢呼,但是这种情绪并没有持续太久,接下来被Oracle的收购,不幸期望远远低于预期。许多MySql的开发者离开了Sun和Oracle公司开始新的项目。在他们中间就有MySQL的创建者以及项目长期技术带头人之一的Michael ‘Monty’ Widenius。Monty和他的团队创建了MySQL的一个fork版本并且命名它为MariaDB。本篇我们会讨论如何在Ubuntu上安装MariaDB。默认上MariaDB的包并没有在Ubuntu仓库中。要安装MariaDB,我们首先要设置MariaDB仓库。设置 MariaDB 仓库$ sudo apt-get install software-proper
mariadb相关课程
mariadb相关教程
- 4、MySQL 的版本 MySQL 分为官方版 Mysql、MariaDB 社区版、Percona 企业版,其中官方原版高负载性能一般,兼容性好,MariaDB 继续开源,高负载性能较好,兼容性一般。如图对比, Percona 企业版高负载性能最好,兼容性好。Percona 版的 MySQL 是 Percona 公司对原版 MySQL 进行性能优化之后再发布的版本,其性能比官方原版好,但是 Percona 版的 MySQL 发布一般要晚于官方原版 MySQL 几个月。在企业生产环境中,一般推荐使用 Percona 版的 MySQL,对于新手而言,本套教程中则使用 MySQL 官方目前最新版本 MySQL8.0。
- 1. Database Tools and SQL PyCharm 中的数据库管理功能由 Database Toools and SQL 插件支持。该插件支持 DataGrip 中提供的所有功能(DataGrip 是开发人员的独立数据库管理环境,也是JetBrains公司旗下的产品):支持查询、创建和管理各种类型数据库, 包括 MySQL、PostgreSQL、SQL Server、SQLite、MariaDB、Oracle、Apache Cassandra 等等,其中数据库可以在本地、在服务器上或云中工作。为了使用PyCharm 数据库管理功能,请确保 Databse Tools and SQL 插件是启用的。主菜单: PyCharm/Files -> Preference/Settings -> Plugins -> DataPyCharm 提供 了打开数据库工具窗口: 主菜单 View -> Tool Windows -> Database,可以进行一系列的数据库操作。
- 3. Django 的主要版本 到目前为止,Django 已经经历了三个大的版本,迭代速度之快,令人不得不佩服。不过目前最新的 3.0 版本于 19 年 12 月发布,还处于快速迭代中,不推荐一开始生产环境就使用 3.0。下面我们简单介绍下 Django 的 1.0 和 2.0 版本之间的主要差别:支持的 Python 版本:这大概是 Django 1.0 和 2.0 之间一个最明显的差别了。参考访问文档,如下:Django versionPython version1.112.7, 3.4, 3.5, 3.6, 3.7 (added in 1.11.17)2.03.4, 3.5, 3.6, 3.72.13.5, 3.6, 3.72.23.5, 3.6, 3.7, 3.8 (added in 2.2.8)可以看到,Django 2.0 之后不再支持 Python 2,甚至 Python 3 的低版本。目前来看,Python 3 已经成了主流,也希望初学者一开始就使用 Python 3 进行编程,不用再纠结使用 Python 2 还是 Python 3。Django 2 相比 Django 1 简化了 URL 路由语法 以及移动友好的 contrib.admin;当然,更多的是模块功能代码上的优化和调整,更多变动细节可以参考这个地址。最后,我们来看看新发布的 Django 3.0 相比 Django 2.0 又有哪些新特点呢?支持 MariaDB Django 现在官方支持 MariaDB 10.1 及以上版本;支持 ASGI Django 3.0 已经完全支持 async 应用了,并提供了部署异步应用的说明;在 PostgreSQL 上支持 ExclusionConstraint;Filter 表达式;model field 的 choices 属性现在支持自定义枚举类型;一些小变更,就不一一列举了,大家可以参考官方的 release 信息。总而言之,Django 1.0 已经逐渐退出历史舞台,2.0 版本是主流,3.0 则是未来。
- 1. 创建第一个Django应用程序 在创建第一个 Django 应用程序之前,我们需要使用 pyenv 工具创建相应的虚拟环境,操作如下:新建一个统一的目录,用于存放 Django 工程代码:[root@server ~]# mkdir django-manual[root@server ~]# cd django-manual/进入虚拟环境,然后建立 django-manual 虚拟环境。一般而言每个 Django 工程会创建一个虚拟环境,这样避免各个 Python 项目之间发生包冲突。建立好虚拟环境之后,激活虚拟环境。操作如下:[root@server django-manual]# pyenv versions system* 3.8.1 (set by /root/.pyenv/version) 3.8.1/envs/env-3.8.1 env-3.8.1 # 新建django-manual虚拟环境[root@server django-manual]# pyenv virtualenv 3.8.1 django-manualLooking in links: /tmp/tmpllz1yd5eRequirement already satisfied: setuptools in /root/.pyenv/versions/3.8.1/envs/django-manual/lib/python3.8/site-packages (41.2.0)Requirement already satisfied: pip in /root/.pyenv/versions/3.8.1/envs/django-manual/lib/python3.8/site-packages (19.2.3)# 手动新建的虚拟环境[root@server django-manual]# pyenv activate django-manualpyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.(django-manual) [root@server django-manual]#接下来,我们需要安装 Django 2.2.11 版本(提示: django 3.0 最近发布了,但是还处于初步完善阶段,所以本次介绍以 Django 2.2.11 版本为准):(django-manual) [root@server django-manual]# pip install django==2.2.11 -i https://pypi.tuna.tsinghua.edu.cn/simpleLooking in indexes: https://pypi.tuna.tsinghua.edu.cn/simpleCollecting django==2.2.11 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/be/76/7ccbcf52366590ca76997ce7860308b257b79962a4e4fada5353f72d7be5/Django-2.2.11-py3-none-any.whl (7.5MB) |████████████████████████████████| 7.5MB 71kB/s Requirement already satisfied: sqlparse in /root/.pyenv/versions/3.8.1/envs/django-manual/lib/python3.8/site-packages (from django==2.2.11) (0.3.1)Requirement already satisfied: pytz in /root/.pyenv/versions/3.8.1/envs/django-manual/lib/python3.8/site-packages (from django==2.2.11) (2019.3)Installing collected packages: djangoSuccessfully installed django-2.2.11WARNING: You are using pip version 19.2.3, however version 20.0.2 is available.You should consider upgrading via the 'pip install --upgrade pip' command.(django-manual) [root@server django-manual]# python -c "import django; print(django.__version__)"2.2.11这样子,虚拟环境中就安装好了 Django 2.2.11。Django 提供 django-admin 命令来帮助我们创建项目和应用,我们只需要使用 django-admin 命令即可快速创建我们的第一个 Django 项目:(django-manual) [root@server django-manual]# django-admin startproject first_django_app(django-manual) [root@server django-manual]# (django-manual) [root@server django-manual]# tree ..└── first_django_app ├── first_django_app │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── manage.py2 directories, 5 filesTips:尽量在 Linux 平台上完成实验,在 Windows 下操作在安装 mysqlclient 模块是会稍微有些工作要做。Django 项目可以由多个应用(app)组成,每个应用是一个逻辑上划分,即将某一个功能模块划归到这个应用。创建一个应用使用 django-admin starapp 应用名即可:(django-manual) [root@server django-manual]# cd first_django_app/(django-manual) [root@server first_django_app]# django-admin startapp hello_app(django-manual) [root@server first_django_app]# tree ..├── first_django_app│ ├── __init__.py│ ├── settings.py│ ├── urls.py│ └── wsgi.py├── hello_app│ ├── admin.py│ ├── apps.py│ ├── __init__.py│ ├── migrations│ │ └── __init__.py│ ├── models.py│ ├── tests.py│ └── views.py└── manage.py3 directories, 12 files可以看到,在使用 django-admin 执行创建 hello_app 应用后,该命令给我们生成了 hello_app 以及若干代码文件。为了能让 Django 项目运行起来,我们需要调整下 settings.py 文件中的配置:# settings.py 中默认使用 sqlite3...DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }}...# 现在调整成 mysql 数据库,读者需要自行准备mysql服务DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'django_manual', 'USER': 'store', 'PASSWORD': 'xxxxxxxxx', 'HOST': '180.76.152.113', 'PORT': '9000', }}有了数据库支持,还需要在 Django 那边安装 mysql 相关的模块包。通常安装的是 mysqlclient 模块:# 安装相应的依赖包(django-manual) [root@server first_django_app]# yum install mysql-devel -y(django-manual) [root@server first_django_app]# pip install mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simpleLooking in indexes: https://pypi.tuna.tsinghua.edu.cn/simpleCollecting mysqlclient Downloading https://pypi.tuna.tsinghua.edu.cn/packages/d0/97/7326248ac8d5049968bf4ec708a5d3d4806e412a42e74160d7f266a3e03a/mysqlclient-1.4.6.tar.gz (85kB) |████████████████████████████████| 92kB 22.2MB/s Installing collected packages: mysqlclient Running setup.py install for mysqlclient ... doneSuccessfully installed mysqlclient-1.4.6最后一件事情,在启动 Django 服务之前,必须要先创建数据库。Django 服务默认并不会帮我们创建好数据库,我们必须手工建好数据库,然后再启动 Django 服务:[root@server ~]# mysql -u store -pxxxxxxxxx -h 180.76.152.113 -P9000Welcome to the MariaDB monitor. Commands end with ; or \g.Your MySQL connection id is 37328Server version: 5.7.26 MySQL Community Server (GPL)Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MySQL [(none)]> CREATE DATABASE IF NOT EXISTS django_manual DEFAULT CHARSET utf8;Query OK, 1 row affected (0.00 sec)MySQL [(none)]> show databases;+--------------------+| Database |+--------------------+| information_schema || alarms || dashboard || django_manual || graph || mysql || performance_schema || sys || uic |+--------------------+15 rows in set (0.00 sec)MySQL [(none)]> exit;Bye# ---------------------------------------------------------------------------------------(django-manual) [root@server first_django_app]# python manage.py runserver 0.0.0.0:8888Watching for file changes with StatReloaderPerforming system checks...System check identified no issues (0 silenced).You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.Run 'python manage.py migrate' to apply them.March 13, 2020 - 07:29:06Django version 2.2.11, using settings 'first_django_app.settings'Starting development server at http://0.0.0.0:8888/Quit the server with CONTROL-C.在完成上述这些步骤后,基本的工程就搭建起来了。接下来我们从外面访问这个端口结果如下:第一次访问 django 服务这个是 Django 在配置中做的一个白名单机制,它有一个 ALLOWED_HOSTS 配置参数,它用来设置访问服务的白名单。如果想要允许任何主机访问,直接设置如下:(django-manual) [root@server first_django_app]# cat first_django_app/settings.py...DEBUG = TrueALLOWED_HOSTS = ['*']...另外,默认 setting.py 中的 DEBUG 参数为 True。正因为如此,请求报错才会有如此详细的提示。在正真上线部署时候,这个参数一定要关闭。如果我设置如下参数再次从外部请求该 Django 服务时,浏览器的输出结果如下图所示。可以看到,除了显示一个冷冰冰 400 错误,无任何提示。这样屏蔽错误信息,防止有人从错误结果中推断服务漏洞,达到渗透的目的。(django-manual) [root@server first_django_app]# cat first_django_app/settings.py...DEBUG = FalseALLOWED_HOSTS = ['127.0.0.1']...设置 Debug=False 的错误输出我们重新设置好 DEBUG 和 ALLOWED_HOSTS 参数后,再次请求 Django 服务,可以得到 Dajngo 内置的欢迎页面,提示我们服务已经正常启动和运行。正常访问 Django 服务现在,我们写一个最简单的 Hello, World 字符串输出到页面上。改动 first_django_app/first_django_app/url.py 文件,这个文件是所有 url 请求路由的入口,所有的映射关系都会先通过这里:(django-manual) [root@server first_django_app]# pwd/root/django-manual/first_django_app(django-manual) [root@server first_django_app]# cat first_django_app/urls.py """注释性文本,省略"""from django.contrib import adminfrom django.urls import path## 新导入模块from django.http import HttpResponse## 视图函数def hello_world(*args, **kwargs): return HttpResponse("Hello, world.", content_type="text/plain")urlpatterns = [ path('admin/', admin.site.urls), ####添加的url映射,由上面的hello_world()函数处理 path('hello/', hello_world),]再次启动 Django 服务,访问 8888 端口的 /hello/ 路径,可以看到页面出现 “Hello, world.” 这样的字符,说明我们的第一个 URL 接口完成。页面输出 Hello,World.
- 2. InnoDB 的热备 目前,比较流行的 InnoDB 存储引擎的热备工具是 Xtrabackup。 xtrabackup 是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQL、Percona server 和 MariaDB,开源免费,是目前较为受欢迎的主流备份工具 ,它能对 InnoDB 数据库和 XtraDB 存储引擎的数据库非阻塞地备份(对于 MyISAM 的备份同样需要加表锁)。Xtrabackup 优点:备份速度快,物理备份可靠;备份过程不会打断正在执行的事务(无需锁表);能够基于压缩等功能节约磁盘空间和流量;自动备份校验;还原速度快;可以流传将备份传输到另外一台机器上;在不增加服务器负载的情况备份数据。实际案例:Xtrabackup 全量备份:[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=MyNewPass4! --port=3306 --no-timestamp /mysql/dbbackup/200823 21:11:33 innobackupex: Starting the backup operationIMPORTANT: Please check that the backup run completes successfully. At the end of a successful backup run innobackupex prints "completed OK!".200823 21:11:33 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;port=3306;mysql_socket=/mysql/tmp/mysql.sock' as 'root' (using password: YES).200823 21:11:33 version_check Connected to MySQL server200823 21:11:33 version_check Executing a version check against the server...200823 21:11:33 version_check Done.200823 21:11:33 Connecting to MySQL server host: localhost, user: root, password: set, port: 3306, socket: /mysql/tmp/mysql.sock......200823 21:11:48 Finished backing up non-InnoDB tables and files200823 21:11:48 [00] Writing /mysql/dbbackup/xtrabackup_binlog_info200823 21:11:48 [00] ...done200823 21:11:48 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...xtrabackup: The latest check point (for incremental): '14533834254'xtrabackup: Stopping log copying thread..200823 21:11:48 >> log scanned up to (14533834263)200823 21:11:49 Executing UNLOCK TABLES200823 21:11:49 All tables unlocked200823 21:11:49 [00] Copying ib_buffer_pool to /mysql/dbbackup/ib_buffer_pool200823 21:11:49 [00] ...done200823 21:11:49 Backup created in directory '/mysql/dbbackup/'MySQL binlog position: filename 'mysql-bin.000022', position '190', GTID of the last change '294ae4cf-be0f-11e7-8269-fa163e665653:1-2769,a373c879-3a2c-11e8-bb78-fa163e665653:1-5,aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-40:1000012-1000013'200823 21:11:49 [00] Writing /mysql/dbbackup/backup-my.cnf200823 21:11:49 [00] ...done200823 21:11:49 [00] Writing /mysql/dbbackup/xtrabackup_info200823 21:11:49 [00] ...donextrabackup: Transaction log of lsn (14533834254) to (14533834263) was copied.200823 21:11:49 completed OK!备份完成后,备份目录将产生如下文件:[root@localhost ~]$ ls -lh /mysql/dbbackup/total 101M-rw-r----- 1 root root 433 Aug 23 21:11 backup-my.cnf-rw-r----- 1 root root 42K Aug 23 21:11 ib_buffer_pool-rw-r----- 1 root root 100M Aug 23 21:11 ibdata1drwxr-x--- 2 root root 4.0K Aug 23 21:11 mysqldrwxr-x--- 2 root root 4.0K Aug 23 21:11 performance_schemadrwxr-x--- 2 root root 12K Aug 23 21:11 sysdrwxr-x--- 2 root root 4.0K Aug 23 21:11 tempdb-rw-r----- 1 root root 166 Aug 23 21:11 xtrabackup_binlog_info-rw-r----- 1 root root 121 Aug 23 21:11 xtrabackup_checkpoints-rw-r----- 1 root root 703 Aug 23 21:11 xtrabackup_info-rw-r----- 1 root root 2.5K Aug 23 21:11 xtrabackup_logfile实际案例:Xtrabackup 增量备份:在进行增量备份之前,首先要有一次全量备份,第一次增量是基于全备份,之后的增量是基于上一次的增量备份。[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=MyNewPass4! --port=3306 --no-timestamp /mysql/hotbackup/base-- 从xtrabackup_checkpoints文件可以看出,备份类型为全备份,lsn号从0至14533834254[root@localhost ~]# cat /mysql/hotbackup/base/xtrabackup_checkpoints backup_type = full-backupedfrom_lsn = 0to_lsn = 14533834254last_lsn = 14533834263compact = 0recover_binlog_info = 0表 customer 插入新的数据:mysql> insert into customer(id,last_name,first_name,birth_date,gender,balance) values(3,333,333,'2020-08-10',1,30);Query OK, 1 row affected (0.00 sec)mysql> insert into customer(id,last_name,first_name,birth_date,gender,balance) values(4,444,444,'2020-09-10',1,40);Query OK, 1 row affected (0.00 sec)第一次增量备份:[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=MyNewPass4! --port=3306 --incremental --no-timestamp /mysql/hotbackup/inc1 --incremental-basedir=/mysql/hotbackup/base-- 从xtrabackup_checkpoints文件可以看出,备份类型为增量备份,lsn号从lsn 14533834254至lsn 14533838790,14533834254为全备份的to_lsn,表示备份从lsn 14533834254以来的增量变化。[root@localhost ~]# cat /mysql/hotbackup/inc1/xtrabackup_checkpoints backup_type = incrementalfrom_lsn = 14533834254to_lsn = 14533838790last_lsn = 14533838799compact = 0recover_binlog_info = 0
- 1. Django ORM 模型的增删改查操作 话不多说,直接进入 django 的交互命令模式:[root@server ~]# pyenv activate django-manual pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.(django-manual) [root@server ~]# cd django-manual/first_django_app/(django-manual) [root@server first_django_app]# python manage.py shellPython 3.8.1 (default, Dec 24 2019, 17:04:00) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linuxType "help", "copyright", "credits" or "license" for more information.(InteractiveConsole)>>>前面在 hello_app 应用目录下的 models.py 中定义了 Member 模型类,导入进来。然后我们实例化 Member 类,并给实例的属性赋值,最后调用模型类的 save() 方法,将该实例保存到表中:>>> from hello_app.models import Member>>> from hello_app.models import Member>>> m1 = Member()>>> m1.name = 'spyinx'>>> m1.age = 29>>> m1.sex = 0>>> m1.occupation = "程序员">>> m1.phone_num = '18054293763'>>> m1.city = 'guangzhou'>>> m1.save()通过 mysql 客户端可以查看该保存的记录,如下:[root@server first_django_app]# mysql -u store -pstore.123@ -h 180.76.152.113 -P 9002Welcome to the MariaDB monitor. Commands end with ; or \g.Your MySQL connection id is 73555Server version: 5.7.26 MySQL Community Server (GPL)Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MySQL [(none)]> use django_manualReading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedMySQL [django_manual]> select * from member where 1=1\G;*************************** 1. row *************************** id: 1 name: spyinx age: 29 sex: 0 occupation: 程序员 phone_num: 18054293763 email: city: guangzhouregister_date: 2020-04-05 07:30:45.0433771 row in set (0.00 sec)ERROR: No query specifiedMySQL [django_manual]>接下来是查询的操作介绍,为了能更好的演示查询操作,我们通过如下代码在 member 中添加100条记录:from datetime import datetimeimport randomimport MySQLdboccupations = ['web', 'server', 'ops', 'security', 'teacher', 'ui', 'product', 'leader']cities = ['beijing', 'guangzhou', 'shenzhen', 'shanghai', 'wuhan']def gen_phone_num(): phone_num = "18" for i in range(9): phone_num += str(random.randint(0, 9)) return phone_numconn = MySQLdb.connect(host='180.76.152.113', port=9002, user='store', passwd='store.123@', db='django_manual')conn.autocommit(True)data = (('spyinx-%d' % i, \ random.randint(20, 40), \ random.randint(0, 1), \ occupations[random.randint(0, len(occupations) - 1)], \ gen_phone_num(), \ '22%d@qq.com' % i, \ cities[random.randint(0, len(cities) - 1)], \ datetime.now().strftime("%Y-%m-%d %H:%M:%S")) for i in range(100))try: cursor = conn.cursor() cursor.executemany('insert into member(`name`, `age`, `sex`, `occupation`, `phone_num`, `email`, `city`, `register_date`) values (%s, %s, %s, %s, %s, %s, %s, %s);', data) print('批量插入完成')except Exception as e: print('插入异常,执行回滚动作: {}'.format(str(e))) conn.rollback()finally: if conn: conn.close()执行 python 代码后,我们通过 mysql 客户端确认100条数据已经成功插入到数据库中:MySQL [django_manual]> select count(*) from member where 1=1\G;*************************** 1. row ***************************count(*): 1011 row in set (0.00 sec)我们执行如下操作:>>> type(Member.objects)<class 'django.db.models.manager.Manager'>>>> Member.objects.get(name='spyinx')<Member: <spyinx, 18054293763>>>>> Member.objects.all().count()101>>> type(Member.objects.all())<class 'django.db.models.query.QuerySet'>上面的语句中 Member.objects.get(name='spyinx') 中,objects 是一个特殊的属性,通过它来查询数据库,它是模型的一个 Manager。首先来看看这个 Manager 类提供的常用方法:all():查询所有结果,返回的类型为 QuerySet 实例;filter(**kwargs):根据条件过滤查询结果,返回的类型为 QuerySet 实例;get(**kwargs):返回与所给筛选条件相匹配的记录,只返回一个结果。如果符合筛选条件的记录超过一个或者没有都会抛出错误,返回的类型为模型对象实例;exclude(**kwargs):和 filter() 方法正好相反,筛选出不匹配的结果,返回的类型为 QuerySet 实例;values(*args):返回一个ValueQuerySet,一个特殊的QuerySet,运行后得到的并不是一系列 model 的实例化对象,而是一个可迭代的字典序列;values_list(*args):它与 values() 类似,只不过 values_list() 返回的是一个元组序列,而 values() 返回的是一个字典序列;order_by(*args):对结果按照传入的字段进行排序,返回的类型为 QuerySet 实例;reverse():对查询结果反向排序,返回的类型为 QuerySet 实例;distinct():去掉查询结果中重复的部分,返回的类型为 QuerySet 实例;count():返回数据库中匹配查询的记录数,返回类型为 int;first():返回第一条记录,结果为模型对象实例;;last():返回最后一条记录,结果为模型对象实例;exists():如果 QuerySet 包含数据,就返回 True,否则返回 False。如果上述这些方法的返回结果是一个 QuerySet 实例,那么它也同样具有上面这些方法,因此可以继续调用,形成链式调用,示例如下:>>> Member.objects.all().count()101>>> Member.objects.all().reverse().first()<Member: <spyinx-99, 18022422977>>此外,在 filter() 方法中还有一些比较神奇的双下划线辅助我们进一步过滤结果:MySQL [django_manual]> select id, name, phone_num from member where name like 'spyinx-2%';+----+-----------+-------------+| id | name | phone_num |+----+-----------+-------------+| 24 | spyinx-2 | 18627420378 || 42 | spyinx-20 | 18687483216 || 43 | spyinx-21 | 18338528387 || 44 | spyinx-22 | 18702966393 || 45 | spyinx-23 | 18386787195 || 46 | spyinx-24 | 18003292724 || 47 | spyinx-25 | 18160946579 || 48 | spyinx-26 | 18517339819 || 49 | spyinx-27 | 18575613014 || 50 | spyinx-28 | 18869175798 || 51 | spyinx-29 | 18603950130 |+----+-----------+-------------+11 rows in set (0.00 sec)>>> Member.objects.all().filter(name__contains='spyinx-2')<QuerySet [<Member: <spyinx-2, 18627420378>>, <Member: <spyinx-20, 18687483216>>, <Member: <spyinx-21, 18338528387>>, <Member: <spyinx-22, 18702966393>>, <Member: <spyinx-23, 18386787195>>, <Member: <spyinx-24, 18003292724>>, <Member: <spyinx-25, 18160946579>>, <Member: <spyinx-26, 18517339819>>, <Member: <spyinx-27, 18575613014>>, <Member: <spyinx-28, 18869175798>>, <Member: <spyinx-29, 18603950130>>]>>>> Member.objects.all().filter(name__contains='spyinx-2').filter(id__lt=47, id__gt=42)<QuerySet [<Member: <spyinx-21, 18338528387>>, <Member: <spyinx-22, 18702966393>>, <Member: <spyinx-23, 18386787195>>, <Member: <spyinx-24, 18003292724>>]>这种双下划线的过滤字段有:contains/icontains:过滤字段的值包含某个字符串的结果;in:和 SQL 语句中的 in 类似,过滤字段的值在某个列表内的结果,比如:>>> Member.objects.all().filter(name__contains='spyinx-2').filter(id__in=[42, 43])<QuerySet [<Member: <spyinx-20, 18687483216>>, <Member: <spyinx-21, 18338528387>>]>lt/gt:过滤字段值小于或者大于某个值的结果;range:过滤字段值在某个范围内的结果;>>> Member.objects.all().filter(name__contains='spyinx-2').filter(id__range=[48, 50])<QuerySet [<Member: <spyinx-26, 18517339819>>, <Member: <spyinx-27, 18575613014>>, <Member: <spyinx-28, 18869175798>>]>startswith/istartswith:匹配字段的值以某个字符串开始,前面的 i 标识是否区分大小写;endswith/iendswiths:匹配字段的值以某个字符串结束;>>> Member.objects.all().filter(id__gt=90).filter(name__endswith='2')<QuerySet [<Member: <spyinx-72, 18749521006>>, <Member: <spyinx-82, 18970386795>>, <Member: <spyinx-92, 18324708274>>]>F查询和Q查询前面我们构造的过滤器都只是将字段值与某个常量做比较。如果我们要对两个字段的值做比较,就需要使用 Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值:>>> from django.db.models import Q# 找出id值大于age*4的记录>>> Member.objects.all().filter(id__gt=F('age')*4)<QuerySet [<Member: <spyinx-70, 18918359267>>, <Member: <spyinx-77, 18393464230>>, <Member: <spyinx-90, 18272147421>>, <Member: <spyinx-91, 18756265752>>, <Member: <spyinx-92, 18324708274>>, <Member: <spyinx-97, 18154031313>>]># 将所有记录中age字段的值加1>>> Member.objects.all().update(age=F('age')+1)101此外,前面的多个 filter() 方法实现的是过滤条件的 “AND” 操作,如果想实现过滤条件 “OR” 操作呢,就需要使用到 Django 为我们提供的 Q() 方法:>>> from django.db.models import Q# 过滤条件的 OR 操作>>> Member.objects.all().filter(Q(name='spyinx-22') | Q(name='spyinx-11'))<QuerySet [<Member: <spyinx-11, 18919885274>>, <Member: <spyinx-22, 18702966393>>]># 过滤条件的 AND 操作>>> Member.objects.all().filter(Q(name__contains='spyinx-2') & Q(name__endswith='2'))<QuerySet [<Member: <spyinx-2, 18627420378>>, <Member: <spyinx-22, 18702966393>>]>对于记录的更新和删除操作,我们同样有对应的 update() 方法以及 delete() 方法:# 删除name=spyinx的记录>>> Member.objects.all().filter(Q(name='spyinx')).delete()(1, {'hello_app.Member': 1})>>> Member.objects.all().count()100# 所有记录的年龄字段加1>>> Member.objects.all().update(age=F('age')+1)101
mariadb相关搜索
-
mac osx
machine_start
macox
magellan
malloc
manifest
manifest文件
map
map 遍历
mapreduce编程
maps google com
margin
margin bottom
margin left
margin right
margin top
marginbottom
marginheight
marginleft
margintop