GVKun编程网logo

MySql(一)(mysql引擎innodb和myisam的区别)

5

在这里,我们将给大家分享关于MySql的知识,让您更了解一的本质,同时也会涉及到如何更有效地Django:模型model和数据库mysql(一)、Java进阶——高性能MySQL(一)、koa-mys

在这里,我们将给大家分享关于MySql的知识,让您更了解的本质,同时也会涉及到如何更有效地Django:模型 model 和数据库 mysql(一)、Java进阶——高性能MySQL(一)、koa-mysql(一)之koa路由模板渲染、linux环境下写C++操作mysql(一)的内容。

本文目录一览:

MySql(一)(mysql引擎innodb和myisam的区别)

MySql(一)(mysql引擎innodb和myisam的区别)

安装MysqL

首先下载MysqL,下载地址为https://dev.mysql.com/downloads/windows/installer/5.7.html

MysqL安装成功后,需要配置到环境变量,配置成功后,就可以登录到MysqL了,客户端登录的命令具体为:

MysqL -h localhost -u root -p

数据库的管理

database:数据库

table:表 表里面存储数据都是行列的模式

数据类型:

1、varchar(20)

2、int

3、double

创建数据库

create database databaseName;

查看数据库

show databases;

删除数据库

drop database databaseName;

进入数据库

use databaseName;

查询当前数据库

select database();

查询数据库版本

select version();

查看数据库的基本信息配置

status;

查询当前时间

select Now();

别名

select Now() as 当前时间

查看连接

show variables like  '%connection%';

查看超时

show variables like  '%timeout%';

表的结构管理

查看数据库中有哪些表

show tables;

创建表

create table tableName(Field Type(size));

查看表的结构

desc tableName;

查看表的创建过程

show create table tableName \G;

show create table tableName \g;

创建表的时候指定存储引擎与编码

create table user(name varchar(20),age int,address varchar(80))ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 

修改表的名称

rename table oldTableName to newTableName;

字段管理

添加字段

添加的字段在首位

alter table tableName add addFiled type first;
desc tableName;

XX字段添加在XX字段的后面

alter table user add addFiled type after existFiled;
desc tableName;

添加字段,默认是在最后一列

alter table user add addFiled type;
desc tableName;

修改字段名

alter table tableName change oldFiled newFiled type;
desc tableName;

修改字段类型

alter table tableName modify Field newType;

删除字段名

alter table tableName drop Field;

增加字段备注

create table user(Field type comment "注释");

修改字段的注释

alter table tableName modify Field type comment "注释";

MysqL的DML语句

INSERT

插入一个字段的一个值

insert into std_info(name) values("zhangsan");
select * from std_info;

插入一行数据

insert into std_info values("zhangsan",10);
select * from std_info;

插入多行数据

insert into std_info values("zhangsan",10),("lisi",20),("wangwu",30);
select * from std_info;

Django:模型 model 和数据库 mysql(一)

Django:模型 model 和数据库 mysql(一)

以一个栗子尝试来记录:

两个表存储在数据库中,BookInfo 表示书,HeroInfo 表示人物。一本书中有多个人物

在 MySQL 中新建一个数据库 Django1,不用创建表,用 Django 模型来配置数据库

1、数据库 ER 图

2、数据库配置

在 settings.py 中进行数据库的配置。

留意:django 默认连接的是 sqlite3 数据库。我们需要修改成 MySQL

django1/settings.py

DATABASES = {
    ''default'': {
        ''ENGINE'': ''django.db.backends.mysql'',
        ''NAME'': ''django1'',
        ''USER'': ''root'', ''PASSWORD'': ''123'', ''HOST'': ''localhost'', ''PORT'': ''3306'' } }

PS:

在 Python3 中用 MySQLdb 连接 MySQL 会猜到一个坑:MySQLdb 只适用于 python2.x,发现 pip 装不上。它在 py3 的替代品是:import pymysql

而 Django 默认的还是使用 MySQLdb: 执行会报:ImportError: No module named ''MySQLdb''

以下为安装 MySQLdb 的解决方法:

方法一:安装 mysqlclient 1.3.10 版本

pip install mysqlclient==1.3.10

方法二:

在站点的 __init__.py 文件中添加

import pymysql
pymysql.install_as_MySQLdb()

3、创建应用

在一个工程里面可以创建多个应用(app)。每个应用对应一种业务

# 创建应用的命令
python manage.py startapp booktest

 

 执行后,多了一个 booktest 目录。该目录就是这个应用所在的目录。

 

4、定义模型类

通过定义模型类去生成数据库。而不是直接写数据库的表

模型类需要继承 django.db.models.Model

注意:在模型类中,不需要定义 PK(主键)的

当输出对象的时候,系统会调用__str__() 方法(描述对象本身)

booktest/models.py

from django.db import models

# Create your models here.

class BookInfo(models.Model):
    # 设置字段
    btitle = models.CharField(max_length = 20)
    bpub_date = models.DateTimeField()

    def __str__(self):
        return self.btitle

class HeroInfo(models.Model):
    # 设置字段
    hname = models.CharField(max_length = 10)
    hgender = models.BooleanField()
    hcontent = models.CharField(max_length = 1000)
    hbook = models.ForeignKey(BookInfo, on_delete = models.CASCADE)

    def __str__(self):
        return self.hname

5、启动服务器

在命令行输入

# 表示启动django服务器,默认使用8000端口
python manage.py runserver

# 使用8080作为端口
python manage.py runserver 8080

然后通过浏览器端访问 http://127.0.0.1:8080/

看到 django 已经成功启动后,此时数据库 django1 中多了一个表 django_miggrations

6、生成数据库的表

首先需要激活模型,编辑 settings.py 文件,在 INSTALLED_APPS 加上应用的名称(booktest)

django1/settings.py

INSTALLED_APPS = (
    ''django.contrib.admin'',
    ''django.contrib.auth'',
    ''django.contrib.contenttypes'',
    ''django.contrib.sessions'',
    ''django.contrib.messages'',
    ''django.contrib.staticfiles'',
    ''booktest''
)

然后生成迁移文件,在命令行输入

# 然后生成迁移文件,在命令行输入
python manage.py makemigrations

# 此时在booktest目录下生成子目录migrations,里面有0001_initial.py
# 0001_initial.py里面系统会主动帮我们的表生成id字段

# 执行迁移,执行SQL语句生成数据库
python manage.py migrate

随后刷新数据库就能在一堆表里看到 booktest_bookinfo booktest_heroinfo 两个表啦

7、测试数据操作

# 进入django的shell
python manage.py shell

# 进行简单的测试(带有django项目的一些配置)导入相关的包
from booktest.models import BookInfo, HeroInfo
from django.utils import timezone
from datetime import *

# 查询所有书的信息
BookInfo.objects.all()

# 新建一本书的信息
b = BookInfo()
b.btitle = ''射鸟英雄传''
b.bpub_date = datetime(year = 2018, month = 8, day = 11)
b.save()

# 查询某本书的信息
b1 = BookInfo.objects.get(pk = 1)
b1.id  
b1.btitle
b1.bpub_date

# 删除书
b1.delete()

# 获取关联集合:(与书有关的所有人物)
b.heroinfo_set.all()

# 创建关联的数据,不用save()都Ok
b.heroinfo_set.create(hname=''欧阳疯'', hgender=False, hcontent = ''蛤蟆功'')

 

Java进阶——高性能MySQL(一)

Java进阶——高性能MySQL(一)

MySQL逻辑架构:

链接管理与安全性:

MySQL5.5或更高版本版本提供了一个API,支持线程池(Thread-Pooling)插件,可以使用池中的少量线程来服务大量的连接。

优化与并行:

MySQL会解析查询,并创建解析树,然后对其进行各种优化,包括重写查询,决定表的读取顺序,以及选择合适的索引等。

并发控制:

1.读写锁:

读锁为共享锁,相互不阻塞。写锁为排他锁,持有写锁会阻塞其他读写操作。

2.锁粒度:

表锁:写操作(增删改)会锁住整张表。

行级锁:写操作仅锁住修改的行。

事务:

事务就是一组原子性的SQL操作。

START TRANSACTION;

......

COMMIT;

特性:ACID(原子性、一致性、隔离性、持久性)。

隔离级别:

事务之间的相互可见程度。

READ UNCOMMITTED  脏读、不可重复读、幻读

READ COMMITTED  不可重复读、幻读

REPEATABLE READ  幻读

SERIALIZABLE  加锁读

假设有连个并发的事务A、B

1.A事务修改某行未提交,B事务查询,则脏读。

2.A事务修改某行提交,B事务在A事务前与提交后均查询,两次结果不同,即不可重复读。

3.A事务新增某行提交,B事务在A事务提交前范围查询,提交后又范围查询,多查出新增行,即幻读。

4.所有事务串行执行,加锁读。

死锁:

事务1

START TRANSACTION;

update stockPrice set close = 45.50 where stock_id=4 and date = ''2002-05-01'';

update stockPrice set close = 19.80 where stock_id=3 and date = ''2002-05-02'';

COMMIT;

事务2

START TRANSACTION;

update stockPrice set high= 20.12 where stock_id=3 and date = ''2002-05-02'';

update stockPrice set high = 47.20 where stock_id=4 and date = ''2002-05-01'';

COMMIT;

凑巧两条事务都执行了第一行,持有了对方的锁。要执行第二行的时候需要对方释放锁,会造成死锁。

InnoDB存储引擎会检查死锁的循环依赖并返回一个错误,处理方式是将持有最少行级排他锁的事务回滚。

InnoDB存储引擎:

1.支持事务。

2.自动崩溃恢复。

MyISAM存储引擎:

1.不支持事务。

2.不支持自动崩溃恢复

3.可以压缩表(只读),压缩表可以极大减少磁盘空间

 

koa-mysql(一)之koa路由模板渲染

koa-mysql(一)之koa路由模板渲染

1.目录结构

clipboard.png

2. package.json

安装依赖

mkdir koa03
cd koa03
npm init
cnpm install ejs koa koa-router koa-views --save

app.js

const Koa = require(''koa'')
const views = require(''koa-views'')
const path = require(''path'')
const app = new Koa()
 
// 加载模板引擎
app.use(views(path.join(__dirname, ''./views''), {
  extension: ''ejs''
}))

 //路由
app.use(require("./routers/index.js").routes());

 //端口
app.listen(3000,()=>{
    console.log(''[demo] server is starting at port 3000'');
})

routers/index.js

定义路由返回

const router = require(''koa-router'')();
router.get(''/'',async(ctx, next) => {
    await ctx.render(''index'')  //返回模板
})
router.get(''/detail'',async(ctx, next) => {
    var arr = [
        {
            id:1,
            name:''a''
        },
        {
            id:2,
            name:''b''
        },
        {
            id:3,
            name:''c''
        }
    ]
    await ctx.render(''detail'',{
        arr //传递数据给模板
    })
})
router.get(''/json'',async(ctx, next) => {
     ctx.body = ''aa''  //返回json数据
})
module.exports = router

views/detail.ejs

ejs模板

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div>detail</div>
    <ul>
        <% for(var i=0;i<arr.length;i++){ %>
        <li><%= arr[i].id %>--<%= arr[i].name %></li>
        <% } %>
    </ul>
</body>

</html>

网页效果

json数据

clipboard.png

模板渲染数据

clipboard.png

linux环境下写C++操作mysql(一)

linux环境下写C++操作mysql(一)

/*****************
connect.cpp
g++ connect.cpp -o connect -I /usr/include/MysqL/ -L /usr/lib/MysqL/ -lMysqLclient
****************/

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"MysqL.h"


class CMysqLInterface
{
    public:
        CMysqLInterface();
        ~CMysqLInterface();
        
        void MysqLLibInit();
        void MysqLLibDestroy();
        int Connect();
        int Close();

    private:
        MysqL *m_MysqLPtr;
};

int main()
{
    printf("version 1.1\n");
    int iRet = -1;
    CMysqLInterface MysqLObj;
    
    iRet = MysqLObj.Connect();
    if(0 == iRet)
    {
        printf("MysqL_real_connect success\n");
    }
    else
    {
        printf("MysqL_real_connect Failed\n");
    }
    return 0;
}

CMysqLInterface::CMysqLInterface()
{
    printf("CMysqLInterface\n");
    m_MysqLPtr = NULL;
    m_MysqLPtr = MysqL_init(NULL);
}

CMysqLInterface::~CMysqLInterface()
{
    Close();

}

int CMysqLInterface::Close()
{
    int iRet = 0;
    
    if(NULL != m_MysqLPtr)
    {
        MysqL_close(m_MysqLPtr);
        m_MysqLPtr = NULL;
    }
    return iRet;
}

void CMysqLInterface::MysqLLibDestroy()
{
    MysqL_library_end();
}

int CMysqLInterface::Connect()
{    
    printf("Connect\n");
    int iRet = -1;
    m_MysqLPtr = MysqL_real_connect(m_MysqLPtr,"localhost","root","csql","child",0,NULL,0);
    if(m_MysqLPtr)
    {
        iRet = 0;
    }
    return iRet;
}

 

[email protected]:~/wangqinghe/MysqL/20190621/01$ g++ connect.cpp -o connect -I /usr/include/MysqL/ -L /usr/lib/MysqL/ -IMysqLclient

/tmp/cceJyiND.o:在函数‘CMysqLInterface::CMysqLInterface()’中:

connect.cpp:(.text+0xaf):对‘MysqL_init’未定义的引用

/tmp/cceJyiND.o:在函数‘CMysqLInterface::Close()’中:

connect.cpp:(.text+0x100):对‘MysqL_close’未定义的引用

/tmp/cceJyiND.o:在函数‘CMysqLInterface::MysqLLibDestroy()’中:

connect.cpp:(.text+0x121):对‘MysqL_server_end’未定义的引用

/tmp/cceJyiND.o:在函数‘CMysqLInterface::Connect()’中:

connect.cpp:(.text+0x17c):对‘MysqL_real_connect’未定义的引用

collect2: error: ld returned 1 exit status 

这个问题是因为连接命令出了错误 后面跟的应该是 -l 而不是-L

 

输出结果:

[email protected]:~/wangqinghe/MysqL/20190621/02$ g++ connect.cpp -o connect -I /usr/include/MysqL/ -L /usr/lib/MysqL/ -lMysqLclient

[email protected]:~/wangqinghe/MysqL/20190621/02$ ./connect

version 1.1

CMysqLInterface

Connect

MysqL_real_connect success

关于MySql的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Django:模型 model 和数据库 mysql(一)、Java进阶——高性能MySQL(一)、koa-mysql(一)之koa路由模板渲染、linux环境下写C++操作mysql(一)的相关信息,请在本站寻找。

本文标签: