Vite Error - defineProps is a compiler macro and no longer needs to be imported

Vite项目启动后,控制台报错:
[@vue/compiler-sfc] defineProps is a compiler macro and no longer needs to be imported.

具体报错提示如:

终端使用 npm run dev 启动项目

1
2
3
4
5
6
7
8
9
10
11
12
13
$ npm run dev            

> vite-project@0.0.0 dev
> vite
Pre-bundling dependencies:
vue
(this will be run only when your dependencies or config have changed)
vite v2.5.0 dev server running at:
> Local: http://localhost:3000/
> Network: use `--host` to expose
ready in 1140ms.

[@vue/compiler-sfc] defineProps is a compiler macro and no longer needs to be imported.

这是使用 vite 初始化生成的项目,什么都还也没改呢,怎么就报错。

提示说:defineProps 是一个编译宏,不再需要导入。

看看哪里引入defineProps了呢?

搜索项目,在HelloWorld.vue中里发现了它:

即文件: vite-project/src/components/HelloWorld.vue

1
2
3
4
5
6
7
8
9
10
11
12
<template>
<h1> msg </h1>
</template>
<script setup>
import { defineProps, reactive } from 'vue'

defineProps({
msg: String
})

const state = reactive({ count: 0 })
</script>

解决办法:

将这句:

1
import { defineProps, reactive } from 'vue'

改成:

1
import { reactive } from 'vue'

即,删除 defineProps 的引入。

重新运行 npm run dev 即可。

估计是改了语法,但是实例项目没有更新导致的。


【END】

如何将 k8s k3s 集群的node节点设置不可调度或删除node节点?

k3s|如何将k8s集群的node节点设置不可调度或删除node节点?

k3s是由 Rancher 公司开发的轻量级Kubernetes,是经CNCF一致性认证的Kubernetes发行版,专为物联网及边缘计算设计。
由于运行 K3s 所需的资源相对较少,所以 K3s 也适用于开发和测试场景。

停止调度的命令

使k8s集群的某个 node 停止被调度的命令有三个,分别是 cordon、drain 和 delete。执行该命令后,后期创建的 pod 不会继续被调度到该节点上。

(1) cordon : 停止调度(不可调度,临时从K8S集群隔离)

该命令操作,只会将node标识为SchedulingDisabled不可调度状态。影响最小,只会将node标识为SchedulingDisabled不可调度状态。之后K8S再创建的pod资源,不会被调度到该节点。原有的 pod 不受影响,仍正常对外提供服务。

(2)drain 驱逐节点(先不可调度,然后排干)

该命令操作,会先驱逐 Node 上的 pod 资源到其他节点重新创建。接着,将节点调为 SchedulingDisabled 不可调度状态。

(3) delete 删除节点

该操作会先驱逐Node节点上的pod资源到其他节点重新创建,然后node节点删除,master失去对其控制,该节点从k8s集群删除。如果要恢复该节点,只能重新将该节点加入到K8S集群中。

下边演示一下具体操作步骤:

以下操作均在 master 节点 vm-2-debian 机器上执行:

  1. 查看本机环境(vm-2-debian):
1
2
3
4
5
6
7
8
9
10
11
12
13
root@vm-2-debian:~# k3s -v
k3s version v1.24.6+k3s1 (a8e0c66d)
go version go1.18.6

root@vm-2-debian:~# kubectl version

root@vm-2-debian:~# ping wang1234.net
PING wang1234.net (43.152.198.184) 56(84) bytes of data.
64 bytes from 43.152.198.184 (43.152.198.184): icmp_seq=1 ttl=43 time=292 ms
^C
--- wang1234.net ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 291.578/291.578/291.578/0.000 ms
  1. 确认节点信息

kubectl get nodes
kubectl get node -o wide

kubectl get po
kubectl get pod
kubectl get pods

1
2
3
4
5
6
7
8
9
10
root@vm-2-debian:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vm-2-debian Ready control-plane,master 2d10h v1.24.6+k3s1
vm-14-debian Ready <none> 2d10h v1.24.6+k3s1

root@vm-2-debian:~# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-6fb79bc456-df9rm 1/1 Running 0 34h 10.42.0.27 vm-2-debian <none> <none>
nginx-6fb79bc456-2c9f9 1/1 Running 0 34h 10.42.0.28 vm-2-debian <none> <none>
nginx-6fb79bc456-ltr85 1/1 Running 0 3s 10.42.1.23 vm-14-debian <none> <none>

可以看到有2个节点,3个pod,其中vm-2-debian节点有2个pod,vm-14-debian节点有1个pod。

  1. 使用 cordon 命令设置为不可调度

kubectl cordon vm-14-debian

1
2
3
4
5
6
7
8
9
10
11
12
13
root@vm-2-debian:~# kubectl cordon vm-14-debian
node/vm-14-debian cordoned

root@vm-2-debian:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vm-2-debian Ready control-plane,master 2d10h v1.24.6+k3s1
vm-14-debian Ready,SchedulingDisabled <none> 2d10h v1.24.6+k3s1

root@vm-2-debian:~# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-6fb79bc456-df9rm 1/1 Running 0 34h 10.42.0.27 vm-2-debian <none> <none>
nginx-6fb79bc456-2c9f9 1/1 Running 0 34h 10.42.0.28 vm-2-debian <none> <none>
nginx-6fb79bc456-ltr85 1/1 Running 0 5m44s 10.42.1.23 vm-14-debian <none> <none>

可以看到 vm-14-debian 节点状态变成了 “SchedulingDisabled” (按计划不可用),原有的 pod 依然有效。

如果想要取消不可调度,恢复到集群,可以使用 uncordon 命令:

kubectl uncordon vm-14-debian

1
2
root@vm-2-debian:~# kubectl uncordon vm-14-debian
node/vm-14-debian uncordoned
  1. 驱逐已经运行的业务容器

kubectl drain –ignore-daemonsets –delete-emptydir-data vm-14-debian

1
2
3
4
5
root@vm-2-debian:~# kubectl drain --ignore-daemonsets --delete-emptydir-data vm-14-debian
node/vm-14-debian already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/svclb-traefik-6760453c-gglvj
evicting pod default/nginx-6fb79bc456-ltr85
pod/nginx-6fb79bc456-ltr85 evicted

查看 node 与 pod 状态:

1
2
3
4
5
6
7
8
9
10
root@vm-2-debian:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vm-2-debian Ready control-plane,master 2d11h v1.24.6+k3s1
vm-14-debian Ready,SchedulingDisabled <none> 2d10h v1.24.6+k3s1

root@vm-2-debian:~# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-6fb79bc456-df9rm 1/1 Running 0 34h 10.42.0.27 vm-2-debian <none> <none>
nginx-6fb79bc456-2c9f9 1/1 Running 0 34h 10.42.0.28 vm-2-debian <none> <none>
nginx-6fb79bc456-ft8xd 1/1 Running 0 5m44s 10.42.0.30 vm-2-debian <none> <none>

可以看到在主节点 vm-2-debian 节点上重新启动了一个 pod,而已被驱逐的节点 vm-14-debian 上的 pod 已不存在了。

  1. 删除node 节点

kubectl delete node vm-14-debian

1
2
3
4
5
6
root@vm-2-debian:~# kubectl delete node vm-14-debian
node "vm-14-debian" deleted

root@vm-2-debian:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vm-2-debian Ready control-plane,master 2d11h v1.24.6+k3s1

删除后,再次查看,只有 vm-2-debian 一个节点了。

参考链接

https://wang1234.net

https://www.cnblogs.com/John-2011/p/14984900.html

https://cloud.tencent.com/developer/article/1796315

Thanks for reading.

Linux Debian 安装与卸载 Redis 服务

Linux Debian 安装与卸载 Redis 服务

Redis 是一个著名的开源键值对(Key-Value)存储数据库。今天来演示一下如下在 Linux Debian/Ubuntu 服务器上安装与卸载 Redis服务。

安装 Redis

(1)查看服务器系统与版本:

1
2
3
4
5
6
7
8
9
10
11
12
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye

$ cat /etc/issue
Debian GNU/Linux 11 \n \l

$ cat /etc/debian_version
11.5

可以看到本机使用 Debian 11.5 系统。

(2)要在 Debian 系统安装 Redis ,可以 apt 命令直接安装:

1
2
$ apt update 
$ apt install redis-server

(3)查看安装的版本:

1
2
3
4
5
6
$ redis-server -v
Redis server v=6.0.16 sha=00000000:0 malloc=jemalloc-5.2.1
bits=64 build=6d95e1af3a2c082a

$ redis-cli -v
redis-cli 6.0.16

(4)检查服务状态:

使用 systemctl 命令查看 redis 服务状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ systemctl status redis
● redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2022-10-16 21:51:43 CST; 14min ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Main PID: 158097 (redis-server)
Status: "Ready to accept connections"
Tasks: 5 (limit: 4379)
Memory: 7.2M
CPU: 967ms
CGroup: /system.slice/redis-server.service
└─158097 /usr/bin/redis-server 127.0.0.1:6379

更多 systemctl 命令如下:

1
2
3
4
5
6
7
systemctl start redis-server   # 启动
systemctl stop redis-server # 停止
systemctl restart redis-server # 重启

systemctl is-enabled redis-server # 检查是否已经设置开机自动启动
systemctl enable redis-server # 设置为开机自动启动
systemctl disable redis-server # 禁止开机自动启动

查看 Redis 服务器系统进程

1
2
3
$ ps -ef|grep redis
redis 158097 1 0 21:51 ? 00:00:00 /usr/bin/redis-server 127.0.0.1:6379
root 160611 148921 0 22:05 pts/0 00:00:00 grep --color=auto redis

检查 Redis 端口状态

1
2
3
$ netstat -nlt | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN
tcp6 0 0 ::1:6379 :::* LISTEN

Redis 默认监听 6379 端口。

(5) 使用 redis-cli 客户端工具操作redis

1
2
3
4
5
6
7
8
9
$ redis-cli -h 127.0.0.1 -p 6379

127.0.0.1:6379> dbsize
(integer) 0
127.0.0.1:6379> set my-home-page wang123.net
OK
127.0.0.1:6379> get my-home-page
"wang123.net"
127.0.0.1:6379> exit

(6) 配置文件

通过 apt 安装的 Redis 的默认配置路径在: /etc/redis/redis.conf

我可以修改 redis.conf 配置文件,找到 port 行,将原默认端口号 6379 改成 6001:

1
2
#port 6379
prot 6001

重启并重新连接 redis 服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 重启
$ systemctl restart redis-server

# 默认连接 6379 端口失败
$ redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> exit

# 指定端口号 6001
$ redis-cli -h 127.0.0.1 -p 6001
127.0.0.1:6001> ping
PONG
127.0.0.1:6001> dbsize
(integer) 1
127.0.0.1:6001> get my-home-page
"wang123.net"
127.0.0.1:6001> exit

卸载 Redis 服务

直接使用 apt 卸载:

1
$ apt purge --auto-remove redis-server

或者手动删除Redis命令与配置文件等:

1
2
3
4
5
6
7
8
9
10
11
$ whereis redis-server
redis-server: /usr/bin/redis-server /usr/share/man/man1/redis-server.1.gz
$ whereis redis-cli
redis-cli: /usr/bin/redis-cli /usr/share/man/man1/redis-cli.1.gz

$ rm /usr/bin/redis-*
$ rm -rf /etc/redis/
$ rm -rf /var/log/redis/
$ rm -rf /var/log/redis/
$ rm -rf /var/lib/redis/
$ rm /etc/init.d/redis-server

参考链接

https://redis.io/

https://www.cnblogs.com/architectforest/p/15737927.html

Thanks for reading.

Go中使用GORM操作SQLite数据库

Go中使用GORM操作SQLite数据库

GORM 是一个使用广泛的 Golang ORM 类库。

SQLite 是一种C语言库,它实现了一个 小型 , 快速 , 自包含 , 高可靠性 , 功能齐全 的 SQL数据库引擎。

GORM 2.0 完全从零开始,引入了一些不兼容的 API 变更和许多改进。

  • (1) GORM 的开发已经迁移至 github.com/go-gorm ,import 路径也修改为 gorm.io/gorm
  • (2) 数据库驱动被拆分为独立的项目。比如:github.com/go-gorm/sqlite ,它的 import 路径变更为 gorm.io/driver/sqlite
  • (3) 支持字段权限:只读、只写、只创建、只更新、忽略
  • (4) 更好的自定义类型支持(例如: JSON)
  • … …

前期准备

查看 go 当前版本:

1
2
$ go version
go version go1.16.5 darwin/amd64

查看 sqlite3 当前版本:

1
2
3
$ sqlite3 --version
3.32.2 2020-06-04 12:58:43
ec02243ea6ce33b090870ae55ab8aa2534b54d216d45c4aa2fdbb00e86861e8c

创建项目

(1) 创建一个名为 go-gorm-sqlite 的目录,并使用 go mod 进行依赖包管理。

1
2
3
4
5
6
$ mkdir go-gorm-sqlite

$ cd go-gorm-sqlite

$ go mod init go-gorm-sqlite
go: creating new go.mod: module go-gorm-sqlite

该操作后,会生成 go.mod 文件,类似于 node 的 package.json 文件。

使用 cat 命令查看该文件内容如下:

1
2
3
4
$ cat go.mod 
module go-gorm-sqlite

go 1.16

(2) 编写个 hello world 代码,保证环境可以跑通。

创建 main.go 文件:

1
2
# 使用 vi 命令编辑
$ vi main.go

文件 main.go 代码如下:

1
2
3
4
5
6
7
8
9
10
package main

import (
"fmt"
)

func main() {
fmt.Println("==> Hello,World!")
}

运行代码:

1
2
$ go run main.go 
==> Hello,World!

安装 gorm 包

使用 go get 进行 gorm 包的安装。

这一步需要引入两个库,一个是 gorm 主库,一个是 sqlite 数据库驱动 (若使用其他数据库,则需要引入其他的驱动)。

1
2
3
4
5
6
$ go get -u gorm.io/gorm
go get: added gorm.io/gorm v1.21.11

$ go get -u gorm.io/driver/sqlite
go get: added github.com/mattn/go-sqlite3 v1.14.7
go get: added gorm.io/driver/sqlite v1.1.4

可以看到 gorm 的 sqlite 驱动,底层使用的还是 mattn/go-sqlite3 库。

再查看一下 go.mod 文件,已经多了 require () 部分,指明引入了哪些包。

1
2
3
4
5
6
7
8
9
10
$ cat go.mod                     
module go-gorm-sqlite

go 1.16

require (
github.com/mattn/go-sqlite3 v1.14.7 // indirect
gorm.io/driver/sqlite v1.1.4 // indirect
gorm.io/gorm v1.21.11 // indirect
)

编写代码

这里的代码参考 gorm 文档。

修改 main.go 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package main

import (
"gorm.io/gorm"
"gorm.io/driver/sqlite"
)

type Product struct {
gorm.Model
Title string
Code string
Price uint
}

func main() {
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}

// Migrate the schema
db.AutoMigrate(&Product{})

// 插入内容
db.Create(&Product{Title: "新款手机", Code: "D42", Price: 1000})
db.Create(&Product{Title: "新款电脑", Code: "D43", Price: 3500})

// 读取内容
var product Product
db.First(&product, 1) // find product with integer primary key
db.First(&product, "code = ?", "D42") // find product with code D42

// 更新操作: 更新单个字段
db.Model(&product).Update("Price", 2000)

// 更新操作: 更新多个字段
db.Model(&product).Updates(Product{Price: 2000, Code: "F42"}) // non-zero fields
db.Model(&product).Updates(map[string]interface{}{"Price": 2000, "Code": "F42"})

// 删除操作:
db.Delete(&product, 1)
}

代码里定义了一个 Product 结构体,对应 sqlite 数据库里的 products 表。

使用 go run 来运行代码:

1
$ go run main.go 

运行结束后,查看当前目录,发现项目里会多一个 test.db 文件,就是生产的 sqlite 数据库文件。

1
2
3
4
5
6
7
8
9
$ ls -al 
total 56
drwxr-xr-x 7 wang staff 224 7 11 13:12 .
drwxr-xr-x 8 wang staff 256 7 11 12:56 ..
-rw-r--r-- 1 wang staff 2308 7 11 13:11 README.md
-rw-r--r-- 1 wang staff 170 7 11 13:05 go.mod
-rw-r--r-- 1 wang staff 1070 7 11 13:05 go.sum
-rw-r--r-- 1 wang staff 990 7 11 13:12 main.go
-rw-r--r-- 1 wang staff 12288 7 11 13:12 test.db

使用 sqlite3 命令查看数据库

在终端中直接使用 sqlite3 + 数据库文件名,可以直接进入数据库提示符界面(如果数据库不存在会直接创建新的数据库)。

在sqlite3提示符界面,SQLite命令已点号(.)开头,比如:

.databases 列出数据库的名称(数据库文件路径)。
.tables 列出数据库里的表。
.schema {表名} 列出表的建表语句。
.indices {表名} 列出表的索引名称。
.exit 退出 SQLite 提示符。
.quit 退出 SQLite 提示符。

以下是操作实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ sqlite3 test.db 
SQLite version 3.32.2 2020-06-04 12:58:43
Enter ".help" for usage hints.

sqlite> .databases
main: /Users/wang/Code/gospace/go-demos/go-gorm-sqlite/test.db

sqlite> .tables
products

sqlite> .schema products
CREATE TABLE `products` (
`id` integer,`created_at` datetime,
`updated_at` datetime,
`deleted_at` datetime,
`title` text,
`code` text,
`price` integer,
PRIMARY KEY (`id`)
);
CREATE INDEX `idx_products_deleted_at` ON `products`(`deleted_at`);

sqlite> .indices products
idx_products_deleted_at

sqlite> .header on
sqlite> .mode list
sqlite> SELECT * FROM products;
id|created_at|updated_at|deleted_at|title|code|price
1|2021-07-11 13:12:42.867814+08:00|2021-07-11 13:12:42.871312+08:00
|2021-07-11 13:12:42.872189+08:00|新款手机|F42|2000

sqlite> .mode line
sqlite> SELECT * FROM products;
id = 1
created_at = 2021-07-11 13:12:42.867814+08:00
updated_at = 2021-07-11 13:12:42.871312+08:00
deleted_at = 2021-07-11 13:12:42.872189+08:00
title = 新款手机
code = F42
price = 2000

参考内容

https://gorm.io/docs/index.html
https://www.runoob.com/sqlite/sqlite-select.html
https://my.oschina.net/wangyongtao/blog/5127208

MySQL 查询语句中的 limit 与 offset 的区别

limit y 分句表示: 读取 y 条数据

limit x, y 分句表示: 跳过 x 条数据,读取 y 条数据

limit y offset x 分句表示: 跳过 x 条数据,读取 y 条数据

比如分页获取数据:

第1页: 从第0个开始,获取20条数据

1
2
selete * from testtable limit 0, 20; 
selete * from testtable limit 20 offset 0;

第2页: 从第20个开始,获取20条数据

1
2
selete * from testtable limit 20, 20; 
selete * from testtable limit 20 offset 20;

第3页: 从第40个开始,获取20条数据

1
2
selete * from testtable limit 40, 20;  
selete * from testtable limit 20 offset 40;

[END]