这是从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
简单测试,只能说是个数据库原型而已。