试用一个用v语言编写的单文件数据库vsql

这是从v语言官网https://vlang.io/看到的,觉得好奇,拿来用用。

1.安装

两种方式,一种下载二进制文件。下载页面:https://github.com/elliotchance/vsql/releases。

另一种是从源代码编译,既可以从上述页面下载源代码压缩包,也可以用git命令获取,

用Git获取并编译的步骤

bash 复制代码
mkdir vsql
cd vsql
git clone --depth=1 https://gitclone.com/github.com/elliotchance/vsql
Cloning into 'vsql'...
remote: 对象计数中: 366, 完成.
remote: 压缩对象中: 100% (328/328), 完成.
remote: Total 366 (delta 32), reused 366 (delta 32)
Receiving objects: 100% (366/366), 1.36 MiB | 124.00 KiB/s, done.
Resolving deltas: 100% (32/32), done.
#把v软件的安装目录加入路径
export PATH=$PATH:/par/v
#直接用make会出错
make
rm -f vsql/y.v vsql/y.y
./scripts/generate-grammar.vsh
v run scripts/vyacc.v -o vsql/y.v vsql/y.y

./scripts/generate-v-client-library-docs.vsh > docs/v-client-library-docs.rst
scripts/generate-v-client-library-docs.vsh:8:1: builder error: cannot import module "v.doc" (not found)
    6 | // Run from the repo root: $ ./scripts/generate-v-client-library-docs.vsh
    7 | //
    8 | import v.doc
      | ~~~~~~~~~~~~
    9 |
   10 | fn get_sym_name(dn doc.DocNode) string {
make: *** [Makefile:48: snippets] Error 1
#按照文档说明,用下列命令行编译成功
root@6ae32a5ffcde:/par/vsql/vsql# make bin/vsql
mkdir -p bin
v  -prod cmd/vsql -o bin/vsql

其实官方还提供第三种安装方式,docker, 不过我没有试验成功。

bash 复制代码
#拉取镜像没有问题
docker pull docker.1ms.run/elliotchance/vsql:latest
Trying to pull docker.1ms.run/elliotchance/vsql:latest...
Getting image source signatures
Copying blob f7dab3ab2d6e done
Copying blob 3f49170c93cc done
Copying blob 2572326293b5 done
Copying config acdd00709b done
Writing manifest to image destination
Storing signatures
acdd00709b59885c090a82eaf2d27b7914cedcb887ae53b32605dd4477fd475e

#运行报错
docker run -it docker.1ms.run/elliotchance/vsql:latest cli mydb.vsql
GC Warning: getcontext failed: using another register retrieval method...

2.运行

(1)CLI方式

和sqlite等单机数据库类似,可以看到,对SQL语法要求比较严格。varchar必须指定长度,insert表必须写明列名。

sql 复制代码
./vsql cli test.vsql
no version information available

vsql> select * from foo;
Error 42P01: no such table: "test".PUBLIC.FOO

vsql> create table foo(a int,b varchar);
Error 42601: syntax error: unexpected ")", expecting "("

vsql> create table foo(a int,b varchar(10));
msg: CREATE TABLE 1
1 row (5 ms)

vsql> insert into foo select 1,'abc';
Error 42601: syntax error: unexpected SELECT, expecting "("

vsql> insert into foo values(1,'abc');
Error 42601: syntax error: unexpected VALUES, expecting "("

vsql> insert into foo(a,b) values(1,'abc');
msg: INSERT 1
1 row (7 ms)

vsql> select * from foo;
A: 1 B: abc
1 row (5 ms)

奇怪的是,在Windows上,同样的命令失败了

sql 复制代码
C:\d>vsql cli test.vsql
no version information available

vsql> create table foo(a int,b varchar(10));
ERROR: cannot acquire lock: cannot create lock file test.vsql.lock

(2)服务器方式

虽然vsql可执行文件很小,它却能当服务器,就成了C/S架构的数据库。

bash 复制代码
#直接按文档写是不行的

./vsql server
Command `server` needs at least 1 argument

#必须指定一个数据库名
./vsql server test.vsql
no version information available
ready on 127.0.0.1:3210

可以另开一个终端,用postgresql的命令行客户端psql来连接, 可以查到刚才插入的数据。

bash 复制代码
psql -h 127.0.0.1 -p 3210
psql (15.13 (Debian 15.13-0+deb12u1), server 0.0.0)
WARNING: psql major version 15, server major version 0.0.
         Some psql features might not work.
Type "help" for help.

root=> select * from foo;
 A |  B
---+-----
 1 | abc
(1 row)

同时服务器端会显示日志, 这是超时退出了。

bash 复制代码
v hash:
                                                        | 0x4e2732 | ./vsql()
                                                        | 0x43ca6c | ./vsql()
                                                        | 0x43c608 | ./vsql()
:?:                                                     | 0x4d402e | ./vsql()
                                                        | 0x403946 | ./vsql()
                                                        | 0x7fef6f25824a | /lib/x86_64-linux-gnu/libc.so.6(+0x2724a)
                                                        | 0x7fef6f258305 | /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x85)
                                                        | 0x403981 | ./vsql()

这个功能在windows上也不能用

bash 复制代码
C:\d>vsql server -v test.vsql
no version information available
V panic: cannot acquire lock: cannot create lock file test.vsql.lock
v hash: 7b9b3dd
print_backtrace_skipping_top_frames is not implemented

简单测试,只能说是个数据库原型而已。