数据库-操作

发布于:2024-04-18 ⋅ 阅读:(29) ⋅ 点赞:(0)

向navicat中导入数据库

通过例子来学习,前置先建立财务中的3大报表:balance资产负债表、cash现金流量表、income利润表、code_to_name股票代码表
导入数据,我用的阿里云的rds
在rds中创建普通用户(只能连接到指定数据库)、创建数据库、开通外网白名单设置为0.0.0.0/0,赋值外网的地址,通过navicat连接。
只有超级用户才能创建数据库,其它用户只有ddl、dql权限
在navicat的表的菜单中,右键–运行sql文件

sql基础概念

sql(structured query language)结构化查询语言。用于实现数据库客户端和服务端之间的通信
sql的分类:
DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等。包括:CREATE、DROP、ALTER、TRUNCATE
DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据)。包括:INSERT、UPDATE、DELETE
DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别。包括:GRANT、REVOKE、CREATE USER
DQL(Data Query Language):数据查询语言,用来查询记录(数据)。包括:SELECT
TCL 事物控制语言,管理数据库事物,包括commit、rollback、savepoint

mysql通常指的是数据库服务,在该服务上可以给各个业务建很多数据库

  • sql关键字不区分大小写(oracle区分)
  • SQL以;(英文分号)结尾,也可以以\G结尾(表示结构化输出结果)
  • 使用’(单引号)或""(双引号)来表示字符串(Oracle只支持单引号)
  • 使用(反引号)来表示数据库、数据表、字段(也可以不使用)
  • 注释一行:–或#。注意 – 需要注释内容前必须加空格;不同dbms不一定支持 #
  • 注解多行:/**/。可任意使用

DBMS 操纵和管理数据库的大型软件
DBS由软件、数据库、数据库管理员组成
nosql(not only sql),强调k-v方式存储

操作数据库

数据库命名规范:采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加下划线’_'组成。通常是小写英文加下划线连接
注意:一个项目一个数据库,多个项目慎用同一个数据库

  • 创建数据库
CREATE DATABASE[IF NOT EXISTS]数据库名    # 避免重复创建数据库
[[DEFAULT]CHARACTER SET字符集名]    # 避免储存的数据乱码
[[DEFAULT]COLLATE 校对规则名]

其中,[]中的内容是可选的。

CREATE DATABASE `financial_report`
CHARACTER SET 'utf8'
COLLATE 'utf8_general_ci';
  • 查看或显示当前用户权限范围内的数据库SHOW DATABASES;
  • 修改已经被创建或者存在的数据库的相关参数。
ALTER DATABASE 数据库名{
[DEFAULT]CHARACTER SET字符集名 |
[DEFAULT]COLLATE校对规则名}
  • 删除数据库 dorp database 数据库名;

创建操作表

创建表

CREATE TABLE 表名(
属性名数据类型[完整性约束条件],
属性名数据类型[完整性约束条件],
属性名数据类型[完整性约束条件])

如:

CREATE TABLE `balance` (
	`id` int(255) NOT NULL AUTO_INCREMENT COMMENT '主键ID且唯一标识符',
	`cid` int(255) NOT NULL COMMENT '会计科目编号(不受信任)',
	`code` varchar(255) NOT NULL COMMENT '公司股票代码',
	`date` varchar(255) NOT NULL COMMENT '指标时间',
	`name`varchar(255) NOT NULL COMMENT'指标名',
	`amount` varchar(255) DEFAULT NULL COMMENT '指标金额',
	`unit`varchar(255) NOT NULL COMMENT '指标单位',
	`create_timestamp` varchar(255) NOT NULL COMMENT '创建时间戳',
	PRIMARY KEY (`id`)
);

最后也可以加上 ENGINE=InnoDB DEFAULT CHARSET=utf8;
开头可以是

CREATE TABLE `mydb`.`balance`

对于金额方面,为了避免浮点精度问题,通常用字符串存,避免失去精度

确定数据类型,先确定大类
  • 数字类型:INTEGER(size),INT(size),SMALLINT(size),TINYINT(size)。仅容纳整数。在括号内规定数字的最大位数
  • 小数类型:DECIMAL(size,d),FLOAT(size,d)。容纳带有小数的数字。“size”规定数字的最大位数,"d"规定小数点右侧的最大位数
  • 字符串:CHAR(size)。容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。在括号中规定字符串的长度
  • 可变长字符串:VARCHAR(size)。容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。在括号中规定字符串的最大长度
  • 日期:DATETIME(yyyymmdd)。容纳日期
约束条件
  • PRIMARY KEY 标识该属性为该表的主键,可以唯一标识对应的元组
  • FOREIGN KEY 标识该属性为该表的外键,是与之联系的某表的主键。 约束表与表之间的关系,在实际中,如果外键约束使用过于频繁,会导致表之间耦合性过强,要慎用
  • NOT NULL 标识该属性不能为空。但可以为空字符串
  • UNIQUE 标识该属性的值是唯一的。允许为空,但空值也是唯一的
  • AUTO_INCREMENT 标识该属性的值自动增加,这是MySQL语句的特色
  • DEFAULT 为该属性设置默认值
查看表结构
  • 查看表对象定义信息 DESCRIBE 表名; navicat中返回图形表格形式
  • 查看表对象定义信息 SHOW CREATE TABLE 表名; navicat中返回建表的语句
根据已有表创建新表

CREATE TABLE 新表名 LIKE 旧表名; 通过关键字like复制另一张表的结构创建新表
CREATE TABLE 新表名 AS SELECT 列1,列2 FROM 旧表名; 通过关键字as复制另一张表的结构和数据创建新表

创建表的注意事项
  • 表名不能为SQL语言的关键字,如create(CREATE)、update(UPDATE)、delete(DELETE)等都不能作为表名。
  • 只能使用半角英文字母、数字、下划线(_)作为数据库、表和列的名称,且名称必须以半角英文字母开头。
  • 表中所有的列都必须指定数据类型。
  • 在创建新的表时,指定的表名必须不存在,否则会报错。
  • 每个表列要么是NULL列,要么是NOT NULL列,这种状态在创建时由表的定义规定,其中NULL为默认设置。
  • 主键是其值唯一标识表中每一行的列,不能设置为NULL,或者说,允许为NULL的列不能设为主键。
  • 列值尽量不设为NULL,可以使用DEFAULT值,这对于计算或数据分组的列更有优势。

更新表

  • 增加列:ALTER TABLE 表名 ADD 列名 数据类型;
  • 删除列:ALTER TABLE 表名 DROP COLUMN 列名;
  • 修改列:alter table tablename modify (column datatype [default value][null/not null],….);
  • 重命名表:alter table tablename rename [to|as] newtablename;,TO 和 AS都可以
更新表注意事项
  • ALTER TABLE语句用于在已有的表中添加、修改或删除列。
  • 理想情况下,不要在表中包含数据时对其进行更新。应该在表的设计过程中充分考虑未来可能的需求,避免今后对表的结构做大改动。
  • 所有的DBMS都允许给现有的表增加列,不过对所增加列的数据类型(以及NULL和DEFAULTE的使用)有所限制。多数DBMS不允许删除或更改表中的列,但允许重新命名表中的列。
  • 许多DBMS限制对已经填有数据的列进行更改,对未填有数据的列几乎没有限制。
  • 使用ALTER TABLE更改表结构,必须在ALTER TABLE之后给出要更改的表名(该表必须存在,否则将出错),并列出要做出哪些更改。
    1. 每个DBMS对表重命名的支持有所不同。对于这个操作,不存在严格的标准。
    2. DB2、MariaDB、.MySQL、Oracle和PostgreSQL.用户使用RENAMET语句,SQL Server用户使用sp_rename存储过程,SQLite用户使用ALTER TABLE语句。
    3. 所有重命名操作的基本语法都要求指定旧表名和新表名。

删除表

删除内容和定义,释放空间:DROP TABLE 表名;
删除内容,释放空间但不删除定义(清空表,表还存在):TRUNCATE TABLE 表名;
删除表中的行:DELETE FROM 表名 WHERE 条件; delete是删除行,如果删除列要用alter

delete from `balance` where `id`=1;

删除错数据,是属于重大的事故,解决的方案是添加是否有效的字段,用update语句更新,把删除操作变为修改操作,又叫逻辑删除

注意事项

应使用关系规则防止意外删除有用的表。
在实际应用中,DROP/TRUNCATE/DELETE三者的区别是明确的。

  • 当不再需要该表时,用DROP语句。
  • 当仍要保留该表,但要删除所有记录时,用TRUNCATE语句。
  • 当要删除部分记录时,通常伴随着WHERE语句,用DELETE语句。
    执行速度,一般来说 DROP > TRUNCATE(不带事物机制,不可逆,DDL) > DELETE (带事物回滚所以效率慢一些,DML)

查询表

  • 查询全部:SELECT * FROM 表名;。不推荐用 * 因为数据库读取多字段,内存消耗快
  • AS别名:其中AS可以省略。表别名可用于WHERE、SELECT、ORDER BY等
  • 去重:SELECT DISTINCT 列名 FROM 表名; 去掉指定列中数据重复的部分。要特别注意,如果去重两列,除非指定的两个列都相同,否则所有行都将被检索出来
  • 限制查询结果(LIMIT通常在查询语句的最后):LIMIT 或 OFFSET SELECT * FROM 表名 LIMIT 10;SELECT * FROM 表名 LIMIT m,n; 从m+1行开始取数,限制返回n行。另一种表现形式是 SELECT * FROM 表名 LIMIT m OFFSET n;
  • 排序:SELECT * FROM 表名 ORDER BY 列名 [ASC|DESC]; ASC正序,DESC倒序,只对查询结果进行排序。在sql语句中的位置,在where,group by,having之后,在limit之前。排序可指定多列,如第1列升序,第2列降序
SELECT * FROM `balance` ORDER BY `code` ASC,`name` DESC;
过滤数据

用where筛选条件,其中任何操作符的比较都不能列出空值。方式:

  1. 条件表达式筛选,用条件运算符。=(建议用<=>,安全等于,可用于判断null值),!=(建议用<>),>,<,=,>=,<=
    • 安全等于可用于判断NULL值,当2个操作数均为NULL时,其返回值为1而不为NULL;而当一个操作数为NULL时,返回值为0
  2. 逻辑表达式筛选,通常用于连接多个条件表达式,用逻辑运算符。AND,OR,&&和,||或,!,多条件的话,最好用括号包起来。如果不用括号改变求值顺序,默认先执行and再执行or
  3. 模糊表达式筛选,用模糊查询关键字。LIKE,between and,in,is null
    • in操作符用来指定条件范围,范围中每个条件都可进行匹配。in和not in都不能用于返回空字段,返回NULL字段使用IS NULL
    • like结合通配符过滤数据,% 除了可匹配一个或多个字符外,还能匹配0个字符。_ 表示任意单个字符。[] 表示括号内所列字符中的一个。^ 表示不在括号所列之内的单个字符。通配符只能用于文本字段,非文本不能用通配符检索。占用时间较长,尽量避免用通配符。把通配符用在搜索模式开始的地方,搜索起来是最慢的
    • 通配符的% 可以匹配任何东西,但NULL例外,模糊匹配区分大小写
示例
SELECT `code`,`date`,`name` FROM `balance`;
SELECT DISTINCT `code` FROM `balance`;
SELECT DISTINCT `code`,`name` FROM `balance`;  # 2列去重的情况
SELECT `code`,`name` FROM `balance` WHERE ((`date` <=> '2021') and (CONVERT(`amount`,DECIMAL(30,2)) >= 100000000 ));   # 钱的金额在数据库中用的varchar类型,为了安全,需要转化为数值型
SELECT COUNT(*) FROM `balance`;  # 尽量避免使用 *
SELECT COUNT(`id`) FROM `balance`; 
查询运行的优先级

FROM -> SELECT -> DISTINCT -> ORDER BY -> LIMIT -> OFFSET

插入数据

插入一条记录:INSERT INTO 表名(列1,列2,…) VALUES(值1,值2,…);
插入多条记录:INSERT INTO 表名(列1,列2,…) VALUES(值1,值2,…), (值1,值2,…), (值1,值2,…);
插入所有字段记录,数值顺序必须与表中字段的顺序一致:INSERT INTO 表名 VALUES(值1,值2,…),(值1,值2,…);
若表的定义允许,则可以在NSERT操作中省略某些列,且省略的列定义为允许NULL值(无值或空值),否则将会报错。

更新数据

UPDATE 表名 SET 列名=值,列名2=值2 WHERE 条件; 如果没有where就更新表中所有行

创建计算字段和函数

  • CONCAT拼接字段:SELECT CONCAT(列1,列2,…) FROM 表名; 可以和运算符、英文字母进行合并。可用 +||操作符来拼接
SELECT `code`,CONCAT(`code`,'-',`name`) AS `code-name` FROM `balance`;

聚合函数

聚合函数主要是对组执行计算,并返回每个组唯一的值 SELECT 聚合函数(列名) FROM 表名;。常用的聚合函数有:

  1. SUM :主要用于返回表达式中所有的总和,忽略NULL值仅用于数字列
  2. COUNT:主要返回每个组的行数,也会返回NULL值的列
  3. MAX:返回表达式中的最大值,忽略NULL值,可用于数字、字符和日期时间列
  4. MIN:返回表达式中的最小值,忽略NULL值,可用于数字、字符和日期时间列
  5. AVG:返回表达式中的所有平均值,仅用于数字列并且自动忽略NULL值
    数学函数:
  6. ABS:求绝对值
  7. SQRT:求平方根
  8. RAND:取一个0~1之间的随机数
  9. FLOOR:向下取整
  10. CEIL:向上取整
  11. SIN、COS、TAN:三角函数

示例:

SELECT `code`,`date`,SUM(
CONVERT(`amount`,DECIMAL(30,1))
) AS `amount_sum`
FROM `balance` WHERE (
(`code`='000333') AND (`date`='2021') AND (`name` IN (
'负债合计','所有者权益(或股东权益)合计'))
)
-- 387946104000.0

DISTINCT是否可以应用于MIN和MAX?
答:从技术上可应用,但无意义,因为最大值与最小值,不影响重复数据

聚类函数的注意事项?
答:WHERE子句不能使用聚类函数,聚类函数在使用前需考虑如何处理NULL(当没有记录时使用聚类函数,会导致记录取值为NULL)

分组

分组:SELECT 列名 FROM 表名 GROUP BY 列名; 或者 SELECT 列名 FROM 表名 WHERE 限定条件 GROUP BY 列名1,列名2;

  1. GROUP BY子句必须位于SELECT子句之后,WHERE子句之后,ORDER BY子句之前
  2. GROUP BY一般和聚合函数一起使用,才有意义
  3. 若GROUP BY子句中嵌套了分组,数据将在最后指定的分组上进行汇总;
  4. GROUP BY子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚合函数);
  5. 如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式,不能使用别名;
  6. 一般情况下,GROUP BY列不允许带有长度可变的数据类型(如文本或备注型字段);
  7. 除聚集计算语句外,SELECT语句中的每一列都必须在GROUP BY子句中给出;
    • 出现报错1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'financial_report.balance.cid' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by。是由于默认的 MySQL8(5.7以下的低版本未开启only_full_group_by) 配置中 sql_mode 配置了 only_full_group_by,需要 GROUP BY 中包含所有 在 SELECT 中出现的字段。only_full_group_by:使用这个就是使用和oracle一样的group 规则, 出现在select后的字段(除了聚合的字段以外SUM,AVG,MAX,MIN)都必须要在group中。可以在命令行模式下使用SELECT @@sql_mode;查询这个配置
SELECT `code`,AVG(
CONVERT(`amount`,DECIMAL(30,1))
),
COUNT(`cid`)
FROM `balance` WHERE (
`name`='资产总计') GROUP BY `code`;
  1. 如果分组列中包含具有NUL值的行,则NULL将作为一个分组返回;如果列中有多行NULL值,它们将被分为一组;
    注意:
    在分组后,整个组只有一条数据,所以不能对非组的数据求平均数等

去掉only_full_group_by规则 https://zhuanlan.zhihu.com/p/103283746 以上是临时修改,永久修改要修改配置文件 https://blog.csdn.net/qq_39954916/article/details/120123550

  1. 过滤分组 HAVING 子句:SELECT 列名 FROM 表名 (WHERE 条件)GROUP BY 列名 HAVING 条件;
    • HAVING与WHERE:类以:如果不指定GROUP BY,则大多数DBMS会同等对待它们。一般来说,使用HAVING时应该结合GROUP BY-子句,而WHERE子句用于标准的行级过滤。
    • WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。WHERE:排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。

以下2条的结果是相同的

SELECT MAX(
CONVERT(`amount`,DECIMAL(30,1))
)
FROM `balance` WHERE (
`cid`=1003) GROUP BY `cid`;



SELECT MAX(
CONVERT(`amount`,DECIMAL(30,1))
)
FROM `balance`
GROUP BY `cid` HAVING `cid`=1003;
分组中使用排序

在使用GROUP BY子句时,需给出ORDER BY子句,这是保证数据正确排序的唯一方法

  • ORDER BY,对输出进行排序,任意列(包括非选择的列)都可以使用
  • GROUP BY,对行分组,但输出可能不是分组的顺序,只能使用选择列或表达式列
SELECT `code`,`date`,`amount` FROM `balance` WHERE 
`name`='资产总计' ORDER BY 
CONVERT(`amount`,DECIMAL(30,1)) DESC

子查询

在一个查询中嵌套另一个查询,从最里面的往外查看

SELECT cust_name,cust_contact
FROM customers
WHERE cust_id IN(SELECT cust_id
                FROM orders
                WHERE order_num IN (SELECT order_num
                                    FROM order_items
                                    WHERE prod_id='RGAN01'));

作用:
执行三条SELECT语句,最里边的子查询返回订单号列表,此列表用于其外面的子查询的WHERE子句;外面的子查询返回顾客ID列表,此顾客ID列表用于最外层查询的WHERE子句;最外层查询返回顾客姓名和顾客联系方式。
注意:

  1. 多数情况下,子查询的SELECT子句中只能有一个列;当子查询的SELECT子句中有多列时,其对应的主查询也需是相对应的多列;
  2. 子查询不能使用ORDER BY,但是主查询可以使用;
  3. 在子查询中,GROUP BY可以起到同ORDER BY相同的作用,
  4. 返回多行数据的子查询只能同多值操作符一起使用,比如N操作符;
  5. SELECT列表中不能包含任何对BLOB、ARRAY、CLOB或者NCLOB类型值的引用;
  6. 子查询不能直接用在聚合函数中;
  7. BETWEEN操作符不能同子查询一起使用,但是BETWEEN操作符可以用在子查询中。
作为计算字段使用子查询
SELECT cust_name,cust_state,(SELECT COUNT(*)
                            FROM orders
                            WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers
ORDER BY cust_name;

作用:
对customers表中每个顾客返回三列:cust_name、cust_state和orders。
orders是一个计算字段,它是由圆括号中的子查询建立的。
注意事项:

  1. 如果在$ELECT语句中操作多个表,应使用完全限定列名来避免歧义。
  2. 子查询并不是解决该类问题的唯一解决方案,同时也并不一定是最有效的。

联结表查询

需要完全限定列名,且需要使用WHERE子句,否则输出笛卡尔积
以下2条作用相同,更多的是使用第一种:

SELECT vend_name,prod_name,prod_price
FROM vendors,products
WHERE vendors.vend_id = products.vend_id;

SELECT vend_name,prod_name,prod_price
FROM vendors INNER JOIN products ON
vendors.vend_id = products.vend_id;

连接多个表就在WHERE中通过AND连接多个表条件,对于多张表,可在FROM中通过AS别名来简化表名
以下2条自连接的作用相同,推荐后面的:

SELECT cust_id,cust_name,cust_contact
FROM customers
WHERE cust_name =(SELECT cust_name
                FROM customers
                WHERE cust_contact ='Jim Jones')


SELECT c1.cust_id,cl.cust_name,cl.cust_contact
FROM customers AS c1,customers AS c2
WHERE c1.cust_name =c2.cust_name
AND c2.cust_contact ='Jim Jones';

左外连接,LEFT OUTER JOIN,从左边的表中选择所有行

集合运算符

在查询结果中进行交并差运算,连接2个select的查询结果集
UNION 重复的行会自动取消
UNION ALL 保留重复行,返回所有匹配的行
UNION中每个查询必须包含相同的列、表达式或聚合函数,各个列不需要以相同次序列出

视图

在数据库中临时的表,是虚拟表,不存在的, 让用户操作更方便,同时也保证系统的安全性,对原表的增加列,对视图不会产生影响。利用视图可简化复杂的连接、过滤不想要的数据、简化计算字段
CREATE|DROP VIEW view_name;

CREATE VIEW productcustomers AS
SELECT cust_name,cust_contact,prod_id
FROM customers,orders,orderitems
WHERE customers.cust_id = orders.cust_id
AND orderitems.order_num = orders.order_num;


SELECT * FROM productcustomers

事物处理

通过确保成批的SQL操作要么完全执行,要么完全不执行,来维护数据库的完整性。如果没有错误发生,整组语句提交给(写到)数据库表;如果发生错误,则进行回退(撤销),将数据库恢复到某个已知且安全的状态。事务处理用来管理INSERT、UPDATE和DELETE语句,不能回退SELECT、CREATE或DROP操作。

概念

事务(transaction):一组SQL语句
回退(rollback):撤销指定SQL语句的过程
提交(commit):将未存储的SQL语句结果写入数据库表
保留点(savepoint):事务处理中设置的临时占位符,可以对它发布回退

BEGIN(START TRANSACTION);  # 开始事物 在mysql中两者的作用一摸一样,只是在begin可能成为关键字的时候,使用start transaction 可以 避免这种情况
ROLLBACK;  # 回滚事物,撤销所有未提交的事物
COMMIT;  # 提交事物
SET AUTOCOMMIT=0;  # 关闭自动提交
SET AUTOCOMMIT=1;  # 开启自动提交
SAVEPOINT s1;  # 设置一个保留点
ROLLBACK TO s1;  # 回滚到s1

存储过程

为以后使用而保存的一条或多条sql语句。简单、安全、高性能

CREATE PROCEDURE procedure_name(parameter_list)  # 创建存储过程
EXECUTE PROCEDURE procedure_name(parameter_list);  # 执行存储过程

触发器

一种让特殊的存储过程,在特定的数据库活动发生时自动执行。可与特定表上的INSERT、UPDATE或DELETE语句相关联,注意这里并没有SELECT、create、drop等。
作用是保证数据的一致,基于某个表的变动在其它表上执行活动。进行额外的验证,并根据需要回滚数据。计算列的值或更新时间戳
如:在删除一条记录之前,复制删除的记录到另一个备份表中
在navicat中,可通过设计表中,找到触发器选项卡,并新建触发器

CREATE TRIGGER 触发器名 BEFORE |AFTER
INSERT | UPDATE | DELETE
ON 表名 FOR EACH Row
<触发器主体># 插入之前删除的表中的数据,使用  OLD.`cid`

锁机制

通过对访问数据库同一资源的并发事物进行顺序化,以防止数据库数据不一致现象的发生。分为2大类

数据库锁

(1)乐观锁:用户自己实现的一种锁机制;
(2)悲观锁:通常所说的数据库锁机制。

行锁

(1)共享锁
(2)排他锁
(3)更新锁

py操作数据库

records库,不像pymysql等工具,直接操作游标对象。又不像sqlachemy需要先写模型。
优点是使用原生sql操作大多数关系数据库,并支持csv、excel、json等多格式输出。代码不超过1000行,便于学习源码
pip install records
records.Database('mysql+pymysql://root:123456@localhost:3306/test') (mysql+pymysql分别是数据库类型和db-api)连接数据库,返回数据库对象,mysql默认连接8小时后自动断连,加参数pool_recycled 每1小时重连
print(db) ,如果显示 open=True说明连接成功
db.query(sql语句) 多行使用三引号
records支持动态变量,即插入数据的时候,支持 :name 写法,通过参数动态传值
插入多条数据,可使用 db.bulk_query(sql语句,参数列表)
通过执行query返回的对象,可以执行以下方法来返回对应格式的数据:

  1. rows[] 获取指定行的记录
  2. rows.all() 返回Record实例列表
  3. rows.as_dict() 返回对应字典的实例列表 或者 rows.all(as_dict=True)
  4. rows.first() 获取第一条记录 或者 rows.first(as_dict=True) 排序字典 rows.first(as_ordereddict=True)
  5. rows.one() 确保只有一条记录

导出excel

rows = db.query('SELECT * FROM test1;')
with open('users.xlsx','wb')as f:
    f.write(rows.export('xlsx'))

生产环境下的数据库

在navicat中,点击用户图表,可进行权限的设置。主机设置 % 表示所有ip都可访问

备份与恢复

备份方式:拷贝二进制(版本号一致,包括最小的版本号)、navicat导出sql(转储sql文件,通过运行sql文件来恢复)、通过mysqldump命令

mysqldump -user=root -password=test --lock-all-tables 数据库名 > test.sql
mysql -u root -p root 数据库名 < test.sql       # 恢复数据

周期性:2小时、1星期、1个月
安全因素:云端存储、跨数据中心、备份前停机或锁表(发布维护或升级公告),防止备份期间有数据写入,重大版本发布前需备份

mysql数据库架构

单点架构
主从读写分离master和slave
高可用mmm,缺点是在插入的节点挂掉,容易数据丢失,很少维护
高可用mha,相对mmm有更少的数据丢失
高可用mgr