Mysql01

使用python连接mysql,安装pymysql包

py -3 -m pip install pymysql

 

 

关系型数据库

Mysql:互联网公司(维护起来比较实用,维护成本比oracle低)

Sqllite:手机里面使用

Oracle:银行、保险、以前外企

Sybase: 银行+通信

 

互联网公司

Key:value

Mongodb:磁盘上

Redis:内存数据库,持久化(存磁盘上)

Memchache:内存数据库

 

数据库服务器:

Linux + mysql 的软件

 

一般的架构:

  • 1 Redis一般做缓存使用,架构分层,分层的基本上都有持久化的数据库外加redis、memchache缓存数据库,
  • 2 redis和memchache一般都是把数据放在内存里面进行使用的,内存要比磁盘使用的要快,如果所有数据从磁盘上门去取速度是非常慢的,大并发做不了那么多的访问,
  • 3 大多数情况下redis或mamchache做为缓存的一部分存在然后后面在一个mysql或者oracle这种架构在互联网比较常见
  • 4 Redis和mamchache两者的区别:redis比mamchache命令更多一些,功能更强大一些;一般使用redis比较多

 

Mysql常用命令

Mysql sever

 

客户端+服务端=数据库的系统

 

安装完了之后,需要将安装目录下的bin目录加入到path中

mysql -uroot -p

-u加用户名,中间不能有空格

-p输入密码,中间不能有空格

 

mysql -h39.106.41.11 -utest -pgloryroad -P3306

连云服务器命令

本地IP:127.0.0.1

 

查看本地有哪些库

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sakila             |

| sys                |

| world              |

+--------------------+

6 rows in set (0.00 sec)

 

切换库名

mysql> use mysql

Database changed

 

查看当前数据库

mysql> select database();

+------------+

| database() |

+------------+

| mysql      |

+------------+

1 row in set (0.00 sec)

 

查看当前库中有哪些表

mysql> show tables;

+---------------------------+

| Tables_in_mysql           |

+---------------------------+

| columns_priv              |

| db                        |

| engine_cost               |

| event                     |

| func                      |

| general_log               |

| gtid_executed             |

| help_category             |

| help_keyword              |

| help_relation             |

| help_topic                |

| innodb_index_stats        |

| innodb_table_stats        |

| ndb_binlog_index          |

| plugin                    |

| proc                      |

| procs_priv                |

| proxies_priv              |

| server_cost               |

| servers                   |

| slave_master_info         |

| slave_relay_log_info      |

| slave_worker_info         |

| slow_log                  |

| tables_priv               |

| time_zone                 |

| time_zone_leap_second     |

| time_zone_name            |

| time_zone_transition      |

| time_zone_transition_type |

| user                      |

+---------------------------+

31 rows in set (0.00 sec)

 

创建表格

create table wlg(id int,name varchar(20));

 

表格中插入数据

Insert into wgl values(1,”吴老师”);

Insert into wgl values(2,”李老师”);

Insert into wgl values(3,”张老师”);

 

删表数据

mysql> delete from test where id = 1;

Query OK, 1 row affected (0.00 sec)

 

mysql> select * from test;

+------+--------+

| id   | name   |

+------+--------+

|    2 | 李老师 |

|    2 | 张老师 |

+------+--------+

2 rows in set (0.00 sec)

 

删表格

 

mysql> drop table wgl;

Query OK, 0 rows affected (0.02 sec)

mysql> update test set id = 100 where name = '李老师';

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0

 

mysql> select * from test;

+------+--------+

| id   | name   |

+------+--------+

|  100 | 李老师 |

|    2 | 张老师 |

+------+--------+

2 rows in set (0.00 sec)

创建库

create database wgl;

删库

drop database wgl;

 

查看表是怎么建立的

mysql> show create table test;

+-------+---------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                              |

+-------+---------------------------------------------------------------------------------------------------------------------------+

| test  | CREATE TABLE `test` (

  `id` int(11) DEFAULT NULL,

  `name` varchar(20) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+-------+---------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

 

查看建表的过程

mysql> show create table test;

+-------+---------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                              |

+-------+---------------------------------------------------------------------------------------------------------------------------+

| test  | CREATE TABLE `test` (

  `id` int(11) DEFAULT NULL,

  `name` varchar(20) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+-------+---------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

 

 

字段分析:

主表

CREATE TABLE `studentinfo`(

`ID` INT(11) NOT NULL AUTO_INCREMENT COMMENT '不为空的自增长的 主键的主键ID',

`student_id` VARCHAR(20) NOT NULL,

`name` VARCHAR(30) NOT NULL,

`sex` CHAR(4) DEFAULT NULL,

`tel` VARCHAR(13) NOT NULL,

`AdmissionDate` DATETIME DEFAULT '0000-00-00 00:00',

`status` TINYINT(2) DEFAULT '0',

PRIMARY KEY(`ID`),

UNIQUE KEY `tel` (`tel`),

UNIQUE KEY `student_id` (`student_id`)

)ENGINE = INNODB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8 COMMENT='学生信息表';

 

关联表

CREATE TABLE grade(

ID INT AUTO_INCREMENT NOT NULL,

stuID VARCHAR(20),

course VARCHAR(20) NOT NULL,

score TINYINT(4) DEFAULT 0,

PRIMARY KEY (ID),

KEY idx_stuid(stuID),

CONSTRAINT FF_ID FOREIGN KEY(stuID)

REFERENCES studentInfo(student_id)

)ENGINE=INNODB CHARACTER SET utf8 COMMENT "学生成绩";

常用的字段类型:

int(11) :数字长度11位,如果不写有个默认值9位或11位

 

NOT NULL:非空,不能为空

 

auto_increment:如果不指定它插入的值,插入第一条数据默认为1,插入第二条数据自增+1

auto_increment=101:设定它从101开始自增

 

comment:备注

 

varchar(20):可变字长,最大值20个字节,省空间,损时间

 

char(4):固定占用,设一个值也会占用4个字节,节省时间,损空间

 

DEFAULT:设置默认值

 

datetime DEFAULT:年、月、日、时、分、秒 '0000-00-00 00:00'

 

date DEFAULT:只有时间,年、月、日

 

time DEFAULT:时、分、秒

 

tinyint(2) DEFAULT '0':非常短的讲述,一般是激活,未激活

tinyint(1) DEFAULT '0':也可以,一般表示为不可用

 

primary key(ID):表示ID为主键,一个表只能有一个主键

 

unique key(tel):(唯一)默认建立索引,表示这个字段加的值只能是不重复的

 

KEY idx_stuid(stuID):把stuID当成索引字段,where条件里面用到哪个要加上索引idx_stuid(stuID)

 

外键

这种情况一般不推荐使用,判断脏数据在数据库可以这么做,在应用层也可做判断,所有这种情况下如果能在应用上,也就是我们写的程序如果能做数据的校验或者是脏数据的产生的话,那么数据表之间不要建成外键的这种表,你让数据库干的事越多,它的性能就会越差

结论:数据库能干的事,如果前端能干,那么都是放在前端,数据库的资源都是宝贵的。

constraint fk_id foreign_key(stuID)

references studentInfo(student_id):

constraint关键字,fk_id是自定义名称, foreign_key(stuID)外键,references关键字

grade表中插入的stuID字段的数据必须在studentInfo的student_id中存在,不在,则不让插入

删除studentInfo中的student_id数据,那么grade中相关的stuID数据必须先删除,才能成功

例如:

studentInfo

student_id:2007123  #不能直接删除,grade表中删除2007123,就可以删除student_id:2007123

grade

stuID:2007124  插入失败

stuID:2007123  插入成功—》把这条先删

引擎:

ENGINE=InnoDB:InnoDB(它有事物)、Myisam

 

字符集设置

DEFAULT CHARSET=utf8

备注:

COMMENT=

数据库的事务:原子性,要么成功,要么失败

一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样、

 

通俗来讲:

执行4个sql设定为事务了,要么都成功,要么都失败,不可能2条成功,2条失败

 

字段区分大小写嘛?

create database xxxx collate ...cs

cs(大小写敏感)

默认不区分大小写

 

使用python进行插入数据(造数据):

"""

写一堆参数连接数据

获取游标

执行sql

关闭游标

关闭连接

"""

#encoding=utf-8

import pymysql

import random

def insertData():

    conn = pymysql.connect(

    host = "127.0.0.1",

    port = 3306,

    user = "root",

    passwd = "123456",

    db = "test", #可以选择默认连接的库

    charset = "utf8")   #设定默认的字符集,建立连接

    cur = conn.cursor() #获取游标,连接的时候获取游标,类似文件里面的游标,记录一下这个游标在操作数据库中的什么表在哪一行了

    conn.select_db("test")#选择了哪个库,可以不写

    courseList = ['python','java','mysql','linux','接口测试','性能测试','自动化测试']

    for i in range(1,101):

        student_id = '20163' + '0' * (3 - len(str(i))) + str(i)

        name = radom.choice(['Lucy','Tom','Lily','Amy','Dave','Aaron','Baron']) + str(i)

        tel = '1' + str(radom.choice([3,5,7,8])) + str(random.random())[2:11]

        sex = random.choice(["女","男"])

        stuinfo_sql = 'insert into studentInfo(student_id,name,sex,AdmissionDate)' \

        values('%s','%s','%s'.'%s',date_sub(now(),interval %s day))' \

        %(student_id,name,sex,tel,random.randint(90,120))  #拼sql,把数据和sql语句进行拼接一个完整的字符串

        cur.execute(stuinfo_sql) #拼完,使用游标执行这个sql

        conn.commit()      #不能回滚,必须生效

        for j in courseList: #把课程列表,再拼成一个成绩,拼到字符串里面拼成一个sql--》grade_sql

            grade_sql = "insert into grade(stuID,course,score) values('%s','%s'.%s)" %(student_id,j,random.randint(80,100)

            cur.execute(grade_sql)

        conn.commit() #提交

        cur.close()      #关闭游标

        conn.commit() #提交

        conn.close()   #关闭连接

insertData()

 

       

posted on 2021-11-24 23:34  Wgl123  阅读(29)  评论(0编辑  收藏  举报