西区代码小仓库 - 数据库
type: channel
link: https://lisper517.top/category/Database/
description: 数据就是一切，一切为了数据
items: 《MySQL必知必会》-Ben Forta（笔记）
items: Python，爬虫与深度学习（15）——番外篇（四）Redis数据库与python
items: Python，爬虫与深度学习（5）——番外篇（三）MySQL数据库进阶
items: Python，爬虫与深度学习（4）——番外篇（二）MySQL数据库基础
items: Python，爬虫与深度学习（2）——爬虫详解（一）爬取金融机构成交持仓排名
items: frp+云服务器搭建能从外网访问的redis、mysql

《MySQL必知必会》-Ben Forta（笔记）
type: item
date: 2025-12-17T14:07:00+00:00
description: 步骤/目录： 无本文首发于个人博客https://lisper517.top/index.php/archives/4248/，转载请注明出处。本文的原文写作日期为2020年9月20日，主要目的是总结《MySQL必知必会》。下面的内容有些缩进或者图片缺失，可以参考 原word文档 。本书的内容十分基础，建议直接看原文，或者忘记语法的时候查阅。初读的时候可以先粗略读一遍，然后把书上的每个例子都打一次。附录c可以作为复习使用。 1.可以创建多个数据库，每个数据库可包含多个表。同一个库中的表不能重名。Schema模式，指库和表的组织形式，可以用describe 表 来查看。表分为行、列，尽量把列细分（数据细分）方便查找；每行数据有一个主键来作为唯一标识，虽然有些数据不一定需要主键才能区分，但一般都应该定义一个主键，Mysql要求任意两行的主键不同，且每行都有一个非NULL的主键，主键也可以定义在多个列上。 定义主键时应该做到：不重用主键（删了以后不重用）；用不可能变的值作为主键；不修改主键值。 除了主键，还可以定义外键，将表中数据关联到其他表。 2.mysql administrator 和 mysql query browser 提供了GUI，可以考虑下载。由于mysql8有一些改动，可能遇到问题。 进入数据库：在cmd输入mysql -uroot -h localhost -p（先将mysql加入环境变量），接下来要求输入密码。如果连接本地服务器，可以省略-h参数。 Mysql命令行中，每个语句末最好加上; mysql不区分大小写，但很多人喜欢将关键字大写。 Mysql不会识别换行符，可以将命令分行写出，便于阅读。 在mysql命令行下，用show命令显示库和表，也可以用show columns from 表名 显示表内列的信息，或者用更简洁的describe 表名。 用help 命令名 获取相关信息。 Show的其他用法：  SHOW STATUS，用于显示广泛的服务器状态信息；  SHOW CREATE DATABASE和SHOW CREATE TABLE，分别用来显示创 建特定数据库或表的MySQL语句；  SHOW GRANTS，用来显示授予用户（所有用户或特定用户）的安 全权限；  SHOW ERRORS和SHOW WARNINGS，用来显示服务器错误或警告消息。 3.select命令返回的顺序可能变化（为底层存储顺序），因为mysql在数据删除后可能重用空间。 如果列中的值有重复，可使用distinct关键字指明查询不同值。Distinct会用于所有列，比如指定了多个列，如果查找到一行，其每个列的数据同前面某行完全一样，那么就不会打印出。 在末尾加limit a,b（a和b为数字），意为指定从行a开始（不包括行a，第一行为0）最多打印b个结果。 用.表示库和表的从属关系。 用order by 语句可以指定用某一列数据排序。该列可以不在显示出来的列中。Order by 后跟多个列时，表示按权重排名。在最后加desc表示降序（对多个列需要分别写一次desc）。Limit必须在order by 之后。Order by 应在where后。 Where：使用between a and b指定数值范围（返回结果包括a和b）。Is null 检索值为NULL的列。检索非某值时不会返回值为NULL的行。 And比or优先。用()分离不同条件，且应该尽量多用()。 In用法类似于python元组。In还可以嵌套where。 Not可以用来否定条件，比如对in、between、exists取反。 正则表达式、通配符：必须用like。 %表示任意字符任意次数（含0次）。%不匹配NULL。 _表示单个字符单次。 通配符搜索比较慢，尤其是放在开头。 用regexp代替like，表示后面跟的是re。不加^和$，regexp默认全部或部分匹配，而like只能全部匹配。Regexp后加binary可区分大小写。 Mysql中的re转义字符要求写成\\而不是单个\。 写的时候要[[]] 写完的re可以用select 字符串 regexp re表达式 的格式来测试，0为未找到。 4.计算字段，通过表中数据经过一定运算得出的数据列，不存在于表中。一般在服务器上就计算出相应数据并返回（因为DBMS的处理快），客户机上并不能区分计算字段和表中数据。 为了使客户机能引用计算字段，需要将计算字段赋予别名，select 计算字段 as 别名 from ... As中，多个计算字段要分别写多个as、赋予不同的别名。 拼接：mysql用conca()函数实现拼接（其他sql用+或||等）。 删掉空格可以用RTrim、LTrim或者Trim函数。 Select省…

Python，爬虫与深度学习（15）——番外篇（四）Redis数据库与python
type: item
date: 2022-09-16T03:54:00+00:00
description: 步骤/目录： 1.Redis简介与安装 2.redis的数据结构 （1）string （2）list （3）set （4）hash （5）zset （6）HLL 3.redis的一些命令 4.redis事务 5.TTL（time to live） 6.排序 7.发布/订阅 8.管道 9.redis GEO 10.其他本文首发于个人博客https://lisper517.top/index.php/archives/53/，转载请注明出处。本文的目的是初步介绍Redis、为爬虫使用redis打好基础，主要整理自 runoob教程 。这里介绍的内容非常浅显，更深入的内容请自行查询书籍。本文写作日期为2022年9月15日。运行的平台为win10和树莓派，编辑器为VS Code。1.Redis简介与安装Redis是一个由 Salvatore Sanfilippo 在2008年开始创造的 key-value 存储系统，是一种开源的非关系型（NoSql）数据库，它的特点有：基于内存，分布式，键值对，支持多种语言的API（Redis本身是由ANSI C写的）。虽然它主要在内存中运行，但也可以将数据保存在磁盘；它支持主从式的数据备份；它的读写性能极高（所以把Redis开放到公网上时还要注意安全性）；它支持事务，多个操作可以打包到一起，要么不执行，要么全部执行（all or nothing）；它支持5种数据类型（字符串，列表，hash散列，集合，有序集合）；它支持推送，key过期。总的来说Redis就是好。在使用Redis时，你可以把它用作主数据库，也可以用作辅数据库，不论何种方式，都是对关系型数据库功能的极大补充。由于redis的一些特性，它特别适合做存储标签这种一对多的工作，而存储标签在mysql这样的关系型数据库中比较麻烦；redis可以设置键的过期时间TTL（time to live），到期后自动过期，这是很多服务都需要的（比如登录cookie的过期）；redis的读写效率非常高，在轻度使用中很少会遇到redis是瓶颈的情况；redis的命令比sql要简单得多（因为它以键值对形式存储数据）。下面介绍三种安装redis的方法。需要注意，redis为了效率而牺牲了安全性，所以默认情况下redis几乎没有保护措施，不要把它开放到外网。在windows上安装redis：window版redis由热心网友维护，版本远落后于linux版或docker版（目前是5.0和7.0的差距），所以不推荐下载。需要的话，建议在windows上用docker安装redis，见 Docker入门（一） 。如果嫌麻烦的话，到 windows版redis下载网页 下载zip文件或msi文件，解压或安装即可。解压zip文件，或用msi文件安装后，在cmd中进入redis目录，运行 redis-server.exe redis.windows.conf 即可运行redis服务器端。然后在同样的目录下，运行 redis-cli.exe -h 127.0.0.1 -p 6379 即可连接到redis数据库。但是要注意，目前它的版本只有5.0，笔者在后续将演示redis使用tls双向验证，但这是redis 6.0后才加入的功能。所以有条件的话还是用docker装redis。在linux上：到 https://download.redis.io/releases/ 下载tar.gz文件，解压、 make 即可。具体过程为：mkdir /usr/local/redis cd /usr/local/redis wget https://download.redis.io/releases/redis-7.0.4.tar.gz #最新版本的redis tar -xzf redis-7.0.4.tar.gz cd redis-7.0.4 apt-get install pkg-config make gcc libssl-dev #一些依赖项 make BUILD_TLS=yesBUILD_TLS=yes 这个选项在redis 6.0以后可用，是用tls在传输层对redis通信加密的一种方式，在后续安全性的部分会提到。这里介绍一下如何用docker安装redis（安装docker、docker-compose请参考 Docker入门（一） 和 Docker入门（二））。在linux上使用如下命令（windows上也是一样的步骤，只是路径改一下）：mkdir -p /docker/redis/data/redis vim /docker/redis/docker-compose.yml写入如下内容：version: "3.9" services: redis: image: redis p…

Python，爬虫与深度学习（5）——番外篇（三）MySQL数据库进阶
type: item
date: 2022-09-03T08:31:00+00:00
description: 步骤/目录： 1.再谈数据库基础概念 2.mysql基础命令 （1）SHOW与USE （2）HELP 3.检索数据 （1）SELECT （2）DISTINCT （3）LIMIT （4）ORDER BY （5）WHERE （6）IN （7）LIKE与通配符% （8）正则表达式 4.检索数据的进阶操作 （1）计算字段 （2）数据处理函数 （3）聚集函数 （4）数据分组 （5）子查询 （6）联结表 （7）其他联结概念 （8）组合查询 （9）全文本搜索 5.插入数据 6.更新删除数据 7.创建和操作表 8.视图 9.存储过程及其他 10.数据库维护 11.mysql使用的原则 12.python中使用mysql本文首发于个人博客https://lisper517.top/index.php/archives/43/，转载请注明出处。本文的目的是对MySQL进行进阶学习、总结。本文写作日期为2022年9月3日。本文主要整理自《MySQL必知必会》。1.再谈数据库基础概念数据库，从字面意思上理解就是存储数据的仓库。其实把爬虫爬取到的页面存成html放到一个文件夹里也算数据库，只是存取效率较慢。实际上，现在说的数据库一般指数据库管理系统（DBMS，database management system），相比于简单地把数据存成文件，DBMS的存取效率更高，占用空间更小。前一篇文章中提到，在数据库中的每一行数据应该有一项独特的数据区别于其他行，称为主键。实际上，主键也可以是几项数据的组合，比如说有一群人，存储他们的身高、体重两项数据，单独一项拿出来可能很容易有重复，但两项都相同的情况就会大大减少，大概就是这个意思。一般来说，主键确定以后就不要更新，即使某一行被删除、它的主键也不应该复用，主键的值在未来不应该更改。SQL即structured query language，与程序设计的C++、Python语言等不同，SQL的构成词少、相对简单，主要是为了操作数据而存在。很多数据库都支持SQL，比如MySQL就使用标准SQL语言，但是不同数据库软件间的语法可能有一些区别，mysql的语句就有可能无法在其他数据库中正常运行（除了mysql的同卵双胞胎mariadb）。MySQL的运行模式是C/S，即Client/Server，数据库存储在服务器上，其他机器通过mysql客户端访问（即使一台机器访问在本机运行的mysql服务器也要通过客户端）。mysql的客户端和服务器端使用同一套软件，就是说安装了mysql就同时安装了服务器端和客户端；或者也可以使用编程语言，如python的pymysql库当作客户端访问服务器端；或者有一些图形化的管理工具，可以一定程度上简化mysql操作。目前（2022年9月）MySQL的版本已经到8.0.29（指docker-mysql），但很多语句还是通用的。一般使用的mysql客户端就是mysql命令行，即你在安装了mysql后用 mysql -h 服务器ip -P 端口号 -uroot -p 进入的界面。mysql命令行中使用命令有两个注意事项：每行命令用 ; 或 \g 结尾后再按 enter键 才会执行（除了少部分简单的语句）；输入 exit 或 quit 可退出。另外还有一些图形化的界面，笔者在这里推荐 MySQL Workbench ，其下载页面为 https://dev.mysql.com/downloads/workbench/ ，它是mysql官方推出的工具（之前mysql被Oracle拿下了），功能强大。另外mysql现在还推出了MySQL Installer，可以一键管理各种mysql官方软件。最后，如果要在mysql命令行里清屏，使用 system clear 或 system cls ，前者适用于linux客户端、后者适用于cmd。2.mysql基础命令（1）SHOW与USESHOW DATABASES 显示所有数据库；USE 数据库名 使用某个数据库，后续操作都在该库中进行；SHOW TABLES 展示库中的表名；SHOW COLUMNS FROM 表名 或 DESCRIBE 表名 来查看一张表有哪些列，列的数据类型等信息，返回的表格式为：+--------------+--------------+------+-----+-------------------+-------------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+-------------------+-------------------+分别表示 列名 ， 数据类型 ， 可…

Python，爬虫与深度学习（4）——番外篇（二）MySQL数据库基础
type: item
date: 2022-09-02T15:08:00+00:00
description: 步骤/目录： 1.mysql特性与基础概念，及安装 2.进入mysql命令行与基本设置 3.mysql命令行的基础命令 4.增删库、表及注意事项 5.表内数据的基础增删查改 6.LIKE 与模糊查找本文首发于个人博客https://lisper517.top/index.php/archives/42/，转载请注明出处。本文的目的是对MySQL进行简单介绍，便于用mysql存储爬虫爬取到的数据。本文写作日期为2022年9月2日。本文主要整理自 runoob教程 。进阶学习mysql可以参考《MySQL必知必会》、《高性能MySQL》等其他书籍，github上有收集这些CS书的仓库；或者查看笔者后续的文章。1.mysql特性与基础概念，及安装除了mysql，还有redis等各种数据库（或者mysql的亲兄弟mariadb等各种sql），它们是为了高速存储数据而出现的。mysql是一种关系性数据库，从上到下，它的构成是：各数据库（database） - 各张表格（table） - 每张表格由行和列组成，列有列名，每一行存储一个条目/记录，每一列的数据类型相同 。另外，mysql中还有主键和索引的概念，每一行记录的主键都不同（其他列可能相同），所以主键可以用于区分每一行记录；索引，类似书籍的目录，用于快速访问数据。mysql支持大型数据库，单张表的上限主要和操作系统允许的最大文件有关，一般来说，一张表占4GB就差不多了，再高可能有一些性能上的问题。最后，mysql是开源的，目前是被Oracle买下。在安装mysql上，笔者建议尽量用docker-mysql的方式安装，可参考 docker-mysql官网 ，或笔者之前的文章。一个基础的docker-compose模板如下：version: "3.9" services: mysql: image: mysql:8.0.29 environment: MYSQL_ROOT_PASSWORD: mysqlpasswd ports: - "53306:3306" command: - mysqld - --character-set-server=utf8mb4 volumes: - /docker/mysql/data/mysql:/var/lib/mysql - /docker/mysql/conf/mysql:/etc/mysql/conf.d - /docker/mysql/backup/mysql:/backup logging: driver: syslog restart: always注意更改一下 MYSQL_ROOT_PASSWORD: mysqlpasswd 这里的密码和 - "53306:3306" 这里的端口（不建议用默认的3306端口）。2.进入mysql命令行与基本设置使用命令： mysql -h 127.0.0.1 -P 3306 -uroot -p 可以mysql里的root用户身份登录mysql， -h 参数指定mysql服务器端的ip， -P 指定端口， -u 指定登录用户（如果用root以外的其他用户登，可用 -u 其他用户名 的格式。注意登录的用户不是linux系统里的用户，而是mysql数据库里的用户）， -p 指定密码登录，之后输入密码即可。如果是本机、默认的3306端口（mysql默认使用3306端口），则前两个参数可以省略。最后，登录其他机器上的mysql服务器时要注意登录的用户是否允许远程登录（docker-mysql则没有这个问题）。如果使用docker-mysql，根据 docker-mysql官网 的描述，将自己的mysql配置文件夹挂载到容器的 /etc/mysql/conf.d 文件夹，如果该文件夹里有任何cnf结尾的文件都会覆盖docker-mysql的默认配置。另外，docker-mysql的默认配置文件为容器里的 /etc/mysql/my.cnf 。关于配置方面，笔者几乎没有更改过，所以这方面了解的不多。用 mysql -h 127.0.0.1 -P 3306 -uroot -p 登录到mysql命令行后，可以新建其他用户。比较推荐的是用GRANT命令：GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON TUTORIALS.* TO 'zara'@'localhost' IDENTIFIED BY 'zara123';这条命令的第一行是为新建的用户赋予权限。这里赋予了该用户查询、插入、更新、删除数据，及新建、删除数据库/表的权限。也可以自行增加或删除权限，或者用 ALL PRIVILEGES 指代所有权限。第二行限定该用户只对TUTORIALS这个database下的所有表有这…

Python，爬虫与深度学习（2）——爬虫详解（一）爬取金融机构成交持仓排名
type: item
date: 2022-08-30T03:22:00+00:00
description: 步骤/目录： 1.需求分析 2.网页请求分析 3.mysql数据库的设置 4.爬虫编写 （0）安装所需模块 （1）日期 （2）爬虫主体编写 （3）mysql存储 （4）正式运行 5.总结与后续本文首发于个人博客https://lisper517.top/index.php/archives/39/，转载请注明出处。本文的目的是从实战出发讲解爬虫+python。由于还想讲解一下python的写法，所以爬虫写的稍微多了一点。本文写作日期为2022年8月30日。操作的平台为win10，编辑器为VS code。爬虫写的好，牢房进的早。使用爬虫时不要占用服务器太多流量，否则可能惹祸上身。除了python与爬虫，这里实际上还需要了解html格式与mysql命令。可以在 runoob-html 或 runoob-mysql 找到初步的学习资料，或者查看笔者后续的文章。最后，笔者的能力有限，也并非CS从业人员，很多地方难免有纰漏或者不符合代码原则的地方，请在评论中指出。1.需求分析在中国金融期货交易所（中金期货）的官网上有各个金融机构的成交持仓数据，具体网址为 http://cffex.com.cn/ccpm/ 。搜索期货、期权，选择类目、日期，即可看到各机构的成交持仓排名，这个数据可以一定程度上反映各金融机构对大盘走势的判断。本文将介绍如何爬取这些数据，在之后的文章中会试图用机器学习的方法对这些数据进行学习、预判。需求是爬取这些数据，并存入mysql数据库。这里会用到requests、bs4（BeautifulSoup）库，就不用scrapy这种牛刀了（scrapy一般也不会用于爬这种表格请求，而是用于递归爬取全站）。2.网页请求分析在chrome中打开网页，按F12打开网页开发工具，在右上角竖着的三个点里找到 停靠侧 ，选择 取消停靠至单独的窗口 。在网页窗口中选择期货，选择一种类目（比如IF），选择前一天，点击查询，这时网页里会出现数据，网页开发工具里会出现一条新的项目，点击这个项目，发现请求网址为 http://cffex.com.cn/sj/ccpm/2022XX/XX/IF.xml?id=97 ，其中 2022XX/XX 是当天的日期。复制这个请求网址并打开，发现是XML格式的数据（html），其中一项如下：<positionRank> <instrumentid>IF2212</instrumentid> <tradingday>2022XXXX</tradingday> <datatypeid>0</datatypeid> <rank>13</rank> <shortname>宝城期货</shortname> <volume>343</volume> <varvolume>136</varvolume> <partyid>0110</partyid> <productid>IF</productid> ...与原网页对照，其中 datatypeid 可能有0、1、2，分别表示成交量排名、持买单量排名、持卖单量排名。经过实验，网址里的 ?id=97 没有什么具体的意义，大概就是一个1~99的随机数。那么只用日期和品种生成网址就行了。最后检查一下请求和响应里有没有什么特殊的项目，没有则只设置一下请求的User-Agent（UA）即可。3.mysql数据库的设置这里选择用docker在树莓派上运行mysql服务。当然也可以直接安装mysql，各种平台安装mysql的教程见 runoob教程 。无论何种方法运行mysql，最关键的问题是搞清楚运行mysql机器的ip，和mysql的root用户密码。如果不是在本地运行mysql，还要注意mysql的root用户是否能远程登录。在树莓派上进行如下操作：mkdir -p /docker/mysql/data/mysql mkdir -p /docker/mysql/conf/mysql mkdir -p /docker/mysql/backup/mysql docker pull mysql:8.0.29 nano /docker/mysql/docker-compose.yml写入如下内容：version: "3.9" services: mysql: image: mysql:8.0.29 environment: MYSQL_ROOT_PASSWORD: mysqlpasswd ports: - "53306:3306" command: - mysqld - --character-set-server=utf8mb4 volumes: - /docker/mysql/data/mysql:/var/lib/mysql - /docker/mysql/conf/mysql:/etc…

frp+云服务器搭建能从外网访问的redis、mysql
type: item
date: 2022-01-30T16:00:00+00:00
description: 步骤/目录： 1.在windows笔记本上下载并配置redis-server 2.购买阿里云服务器，安装frp并配置frps服务器端 3.配置frpc客户端 4.开启服务并验证 5.附录：mysql+frp （1）修改配置 （2）创建远程连接用户 （3）赋予用户权限并刷新退出 （4）打开端口 （5）修改frpc.ini并开启frp本文首发于个人博客https://lisper517.top/index.php/archives/3/，转载请注明出处。本文实验日期2022年1月31日。采用windows笔记本（跑redis服务器）+阿里云服务器（系统镜像Ubuntu 20.04）1.在windows笔记本上下载并配置redis-serverredis官方不建议在windows下运行redis，所以并未提供windows版redis下载。有一些其他大神更新了windows版redis，以下推荐2个：首先是微软版redis。由微软方提供，于2016年7月1日更新了3.0.504版后停止更新。其次是tporadowski版redis（推荐）。由github用户tporadowski提供，目前最新版本为2021年10月18日更新的Redis 5.0.14 for Windows。（若遇到github网页无法打开，可在gitee上注册并导入仓库后下载）（根据runoob网站，Redis5.0新增了Stream数据结构，所以还是下新版的好）对于tporadowski版redis，下载.zip包，解压到安装目录即可。解压完毕后，打开Redis文件夹，编辑redis.windows.conf文件，需要修改3处：将bind 127.0.0.1行注释掉。这一行是仅允许从本地访问redis；用frp应该不用改，但是笔者需要在局域网中访问，所以还是打开了。 将protected-mode yes改为protected-mode no。老版本的redis可能没有这一行，如果没有则建议重新下载新版redis； 新增一行：requirepass 你的密码。由于redis的处理速度较快，建议密码设置的复杂一些。配置完成后，打开cmd命令行，cd到redis文件夹（也可以将redis文件夹添加到系统路径），输入redis-server redis.windows.conf，正常显示redis服务器端界面，即可。在linux下redis的配置也差不多，不同的是linux下redis的配置文件是redis.conf。2.购买阿里云服务器，安装frp并配置frps服务器端首先介绍一下frp。frp分为frps（server）和frpc（client），其中frps运行在有公网ip的云服务器上，frpc运行在内网中的机器上。frp主要用于把内网机器的端口映射到云服务器端口，比如把内网机器的22端口（一般用于ssh）映射到云服务器的6000端口，那么访问云服务器的6000端口即可接入内网机器的ssh服务。如果有其他方法搞到公网ip，也可以跳过这一步。随便选择一个便宜的服务器，购买后安装镜像，这里选择的系统镜像是Ubuntu 20.04。在左侧 服务器运维-远程连接 中设置一下root账户密码，然后下载putty，通过putty连接：连接类型为SSH，端口为默认的22，主机地址填云服务器的ip地址。输入root和root密码后即登录到云服务器。目前frp最新版本为0.38.0（2021年10月25更新）。这里安装frp到/bin目录下（wget github速度慢可以换成gitee上的仓库）：cd /bin wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz tar -zxvf frp_0.38.0_linux_amd64.tar.gz mv frp_0.38.0_linux_amd64 frp cd frp nano frps.ini然后配置一下frps.ini：[common] bind_port = 7000 #frpc上也要有相同的token值 token = 你的密码 #配置log log_file = /var/logs/frps.log log_level = info log_max_days = 3 #frps统计板 dashboard_port = 7500 dashboard_user = wuhuqifei dashboard_pwd = wuhuqifei kcp_bind_port = 7000解读一下配置选项：bind_port是frp使用的端口；token是密码令牌；log是日志相关；dashboard是统计板…