文档章节

DLang、Rust 以及 Golang 对比数据库操作方式

冰力
 冰力
发布于 2019/03/12 14:19
字数 794
阅读 6.7K
收藏 5

3 月,跳不动了?>>>

我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。

一、数据插入 - INSERT

1.1 : DLang 插入数据

import std.stdio;

import hunt.database;

void main()
{
    auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");

    int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
    
    // 打印插入数量
    writeln(result);

    db.close();
}

1.2 : Rust 插入数据

extern crate postgres;

use postgres::{Connection, SslMode};

fn main() {
    let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();

    conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
}

1.3 : Golang 插入数据

import (
    "database/sql"
    "fmt"
    _ "github.com/lib/pq"
    "time"
    "log"
)

func main() {
    db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")

	if err != nil {
		log.Fatal(err)
		return nil
	}
	
	stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")

    stmt.Exec()
    
	stmt.Close()
}

二、数据查询 - SELECT

2.1 : DLang 查询数据

import std.stdio;

import hunt.database;

void main()
{
    auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");

    foreach(row; db.query("SELECT * FROM user LIMIT 10"))
    {
        writeln(row["username"]);
    }

    db.close();
}

2.2 : Rust 查询数据

extern crate postgres;

use postgres::{Connection, SslMode};

fn main() {
    let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();

    for row in &conn.query("SELECT * FROM user", &[]).unwrap();
        println!("Found person {}", row.get(0));
    }
}

2.3 : Golang 查询数据


import (
    "database/sql"
    "fmt"
    _ "github.com/lib/pq"
    "time"
    "log"
)

type User struct {
	UserName    string
}

func main() {
    db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")

	if err != nil {
		log.Fatal(err)
		return nil
	}
	
	user := User{}
	
	stmt := db.Query("SELECT * FROM user")
	
    for rows.Next() {
		rows.Scan(&user.UserName)
		fmt.Println(user.UserName)
	}
	
	stmt.Close()
}

三、总结

对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。

这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)

在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。

总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。

© 著作权归作者所有

冰力

冰力

粉丝 65
博文 11
码字总数 8049
作品 11
闵行
CTO(技术副总裁)
私信 提问
加载中

评论(10)

张金富
张金富
dlang操作数据库用的mysql rust和go是postgre 这样好吗?
冰力
冰力 博主

引用来自“滔滔007”的评论

DLang和Rust连接报错怎么处理的? 程序直接蹦了吗, golang的代码有错误处理的部分。

@滔滔007 谢谢指正 判断代码回头加上
滔滔007
DLang和Rust连接报错怎么处理的? 程序直接蹦了吗, golang的代码有错误处理的部分。
Alex-loongkylin
Alex-loongkylin
如果有更多文档就好了
yak
yak
dart如何查询数据库?
冰力
冰力 博主

引用来自“vector_ming”的评论

你还在 原生拼SQL, OUT了, 你这样的DEMO还是少发出来少点评的好。

引用来自“冰力”的评论

学习需要徐徐渐进,我写的太高深怕你看不懂,ORM 的话可以看一下这个项目的 README.md https://github.com/huntlabs/hunt-entity

引用来自“vector_ming”的评论

以后你可以分享一些有深度的文章。。。😉
我简单了解过 golang 和 rust 的 ORM,太简陋了,简直称不上是 ORM,基本就是 hunt-database 层面的 SQLBuilder 而已,ORM 这个点上来说 DLang 绝对有优势,毕竟是按照 JPA 标准去设计的。
Dainslef
Dainslef
Rust也是有成熟的ORM實現的,比如https://github.com/diesel-rs/diesel,只是不是JPA風格的,而是類似LINQ/Slick的函數式風格,將組合算子轉化為SQL語句。
vector_ming
vector_ming

引用来自“vector_ming”的评论

你还在 原生拼SQL, OUT了, 你这样的DEMO还是少发出来少点评的好。

引用来自“冰力”的评论

学习需要徐徐渐进,我写的太高深怕你看不懂,ORM 的话可以看一下这个项目的 README.md https://github.com/huntlabs/hunt-entity
以后你可以分享一些有深度的文章。。。😉
冰力
冰力 博主

引用来自“vector_ming”的评论

你还在 原生拼SQL, OUT了, 你这样的DEMO还是少发出来少点评的好。
学习需要徐徐渐进,我写的太高深怕你看不懂,ORM 的话可以看一下这个项目的 README.md https://github.com/huntlabs/hunt-entity
vector_ming
vector_ming
你还在 原生拼SQL, OUT了, 你这样的DEMO还是少发出来少点评的好。
高性能 D 语言编译器 - LDC

LDC 是一个高性能的 D 语言编译器,依赖 DMD 作为语言前端,后端使用 LLVM 架构生成代码,在各项测试中与 C 和 C++ 性能持平,这也使得 dlang 的计算性能高于比较新的 rust 和 golang 。 LD...

匿名
2017/02/03
1.6K
0
golang vs dlang vs nodejs vs php 性能对比较量

这是我本机开的一个单核1G内存的Hyper-V虚拟机,首先我们使用的语言和框架版本给大家看一下: root@kerisy:/home/zoujiaqing# go versiongo version go1.5.1 linux/amd64root@kerisy:/home/...

冰力
2015/11/13
2.7K
4
LDC 1.10.0 发布,支持 DragonFly BSD

LDC 1.10.0 已发布,主要更新内容如下: Based on D 2.080.1. Win64: Breaking ABI change by passing vectors efficiently in registers. Config file extensions for cross-compilation. ......

冰力
2018/06/22
299
0
xmake v2.1.2 版本更新,增强 Visual Studio 工程支持

概述 此版本主要增强了vs201x工程的生成,以及支持vs2017编译环境,并且针对archlinux提供更加方便的aur安装。 项目主页 查看文档 详细更新内容如下: 新特性 添加aur打包脚本,并支持用yao...

ruki
2017/03/24
961
1
查看 Golang、Lua、JS、Rust、Python等语言生成的汇编代码 - 知乎

为什么写这篇文章? 昨天在技术群上,有人问了个问题: 如果一个结构体, 只是读里面的成员, 在 golang 里面传值的时候, 不传递指针, golang 编译器会帮你优化成 const & 么? 随便一猜:golan...

what-i-know
2019/10/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java是如何实现自己的SPI机制的? JDK源码(一)

注:该源码分析对应JDK版本为1.8 1 引言 这是【源码笔记】的JDK源码解读的第一篇文章,本篇我们来探究Java的SPI机制的相关源码。 2 什么是SPI机制 那么,什么是SPI机制呢? SPI是Service Pro...

源码笔记
35分钟前
15
0
开源分布式ID生成器UidGenerator的技术实现

1、引言 很多人一想到IM应用开发,第一印象就是“长连接”、“socket”、“保活”、“协议”这些关键词,没错,这些确实是IM开发中肯定会涉及的技术范畴。 但,当你真正开始编写第一行代码时...

SummerGao
42分钟前
28
0
设计模式-责任链模式

责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将...

muggle-
58分钟前
11
0
看完这篇,别人的开源项目结构应该能看懂了

我为什么要写这篇 近来,和不少初学Spring或Spring Boot的小伙伴私信交流了关于项目目录结构划分和代码分层的问题。 很多小伙伴表示网上下载下来的开源项目看不懂,项目结构和代码分层看得很...

素小暖OSC
今天
22
0
如何转换高度:0; 达到高度:自动; 使用CSS? - How can I transition height: 0; to height: auto; using CSS?

问题: I am trying to make a <ul> slide down using CSS transitions. 我正在尝试使用CSS过渡使<ul>滑落。 The <ul> starts off at height: 0; <ul>从height: 0; . 。 On hover, the heig......

javail
今天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部