第九章:连接数据库(learning julia 译)

如何连接数据库?

关系数据库

NoSQL数据库

REST简介

REST是支持互联网上运行的最现代Web应用程序的底层架构。 与传统的基于SOAP和WSDL的架构相比,它提供了一种更简单的架构形式。

Representational State Transfer(REST)是一种在客户端和服务器之间发送和接收数据的简单方法,主要使用HTTP完成,并且数据在大多数情况下使用JSON格式进行传输或交换。 它是基于简单对象访问协议(SOAP)的Web应用程序的真正轻量级替代品。

REST使用HTTP方法(如GET,POST,PUT和DELETE)来更新服务器上的资源。 它提供了统一接口的简单性以及支持大量组件的可扩展性。

以下是根据Wikipedia定义RESTful系统的一些架构约束。 如果发现某个状态违反了任何这些约束,那么整个系统可能不会被称为RESTful:

  • 客户端 - 服务器架构:客户端 - 服务器约束背后的主要思想是关注点的分离。
    将UI与数据存储分离可以极大地提高可移植性以及跨多个平台的可伸缩性。
  • 无状态:来自客户端的每个请求本身应该是完整的,因为它应该包含所有必要的信息,以使服务器能够处理和响应客户端的请求。
  • 可缓存性:与万维网一样,客户和中介可以缓存响应。 因此,响应必须隐式或显式地将自身定义为可高速缓存,以防止客户端重用陈旧或不适当的数据以响应进一步的请求。
  • 分层系统:客户端通常无法判断它是直接连接到终端服务器还是中途。 中间服务器可以通过启用负载平衡和提供共享缓存来提高系统可伸缩性。
  • 按需代码:服务器可以通过传输可执行代码来临时扩展或自定义客户端的功能。 这样的示例可以包括编译的组件,例如Java applet和客户端脚本,例如JavaScript。
  • 统一接口:统一接口约束是任何REST服务设计的基础。 它简化并解耦了架构,使每个部件都能独立发展。 这种统一界面的四个约束是:
1. 请求中的资源标识
2. 通过表示来处理资源
3. 自我描述性的信息
4. 超媒体作为应用程序状态的引擎

通过RESTful架构的属性和功能,让我们试着探索如何在Julia中使用它。 但在此之前,我们需要刷新我们对JSON知识作为数据传输媒介。

什么是JSON?

JSON是JavaScript Object Notation的缩写,就像RESTful Web应用程序中客户端和服务器之间数据传输的黄金标准。 以下是JSON对象的示例:

{
"name":"rahul",
"subjects_with_scores":{
"maths":80,
"science":90,
"computers":100
},
"country":"india",
}

如您所见,我们在此处表示了一个非常简单的JSON对象。 它使用一种格式,该格式使用键:值对来存储数据。 这些也可以在其中嵌套结构。 有关更多信息,您可以访问官方JSON网站http://www.json.org

JSON的一个缺点是无法对其进行评论。 但是,JSON5格式的JSON版本与JSON非常相似,但可以保留注释以及一些可以提高用户整体可读性的微小改进。 JSON5对象的一个小例子如下:

{
foo: 'bar',
while: true,
this: 'is a \
multi-line string',
// this is an inline comment
here: 'is another', // inline comment
/* this is a block comment
that continues on another line */
hex: 0xDEADbeef,
half: .5,
delta: +10,
to: Infinity, // and beyond!
finally: 'a trailing comma',
oh: [
"we shouldn't forget",
'arrays can have',
'trailing commas too',
],
}

由于它与JSON的不同,因此名称.json5的格式完全不同。 有关相同的更多信息,您可以查看或访问网站http:/ / www.json5.org。

但是,在本节中,我们将重点介绍如何在Julia中使用JSON以及如何创建基于REST的小型服务。 从一个非常简单的例子开始,让我们使用网站http:// httpbin.org来实际进行一些调用,看看我们是否可以从服务器获得响应。

为了运行它,我将使用JuliaBox的在线Julia笔记本,可在https:/ / www.juliabox.com免费获得。 熟悉Jupyter笔记本的人在使用它时不会遇到任何问题; 但是,对于不习惯它的人,
你可以跳到https://lectures.quantecon.org/jl/getting_started.html
注:附requests 库https://github.com/JuliaWeb/Requests.jl(到编译本文为止该库不支持julia1.0)
JuliaBox是在julia线运行环境,如果直接访问不了,则需要墙到外面
现在让我们看看以下代码:

julia> using Requests
julia> using JSON
julia> result = Requests.get("http://httpbin.org/get")
Response(200 OK, 14 headers, 281 bytes in body)
julia> typeof(result)
HttpCommon.Response
julia> fieldnames(result)
8-element Array{Symbol,1}:
:status
:headers
:cookies
:data
:request
:history
:finished
:requests
julia> println(result.data)
UInt8[0x7b, 0x0a, 0x20, 0x20, 0x22, 0x61, 0x72, 0x67, 0x73, 0x22, 0x3a,
0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x0a, 0x20, 0x20, 0x22, 0x68, 0x65, 0x61,
0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x22, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x22, 0x3a, 0x20, 0x22,
0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x61, 0x70,
0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x68,
0x74, 0x6d, 0x6c, 0x2b, 0x78, 0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c,
0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x6d, 0x6c, 0x3b,
0x71, 0x3d, 0x30, 0x2e, 0x39, 0x2c, 0x2a, 0x2f, 0x2a, 0x3b, 0x71, 0x3d,
0x30, 0x2e, 0x38, 0x22, 0x2c, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22,
0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a,
0x20, 0x22, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x22, 0x2c, 0x20, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x22, 0x48, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x22,
0x68, 0x74, 0x74, 0x70, 0x62, 0x69, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x22,
0x2c, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x73, 0x65, 0x72,
0x2d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65,
0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x6a, 0x6c, 0x2f, 0x30, 0x2e,
0x30, 0x2e, 0x30, 0x22, 0x0a, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x0a, 0x20,
0x20, 0x22, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22,
0x33, 0x35, 0x2e, 0x31, 0x38, 0x38, 0x2e, 0x31, 0x34, 0x32, 0x2e, 0x31,
0x36, 0x32, 0x22, 0x2c, 0x20, 0x0a, 0x20, 0x20, 0x22, 0x75, 0x72, 0x6c,
0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x68,
0x74, 0x74, 0x70, 0x62, 0x69, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67,
0x65, 0x74, 0x22, 0x0a, 0x7d, 0x0a]
julia> typeof(result.data)
Array{UInt8,1}
julia> output = JSON.parse(convert(String, result.data))
Dict{String,Any} with 4 entries:
"headers" => Dict{String,Any}(Pair{String,Any}("Connection",
"close"),Pair{St…
"args" => Dict{String,Any}()
"url" => "http://httpbin.org/get"
"origin" => "35.188.142.162"

julia> output["headers"]
Dict{String,Any} with 4 entries:
"Connection" => "close"
"Host" => "httpbin.org"
"Accept" =>
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=…
"User-Agent" => "Requests.jl/0.0.0"

您可以清楚地注意到,我们使用了JSON和Requests包(Kenneth Reitz着名的请求Python库的Julia端口)。 在第一步中,我们向网站http:/ / www。httpbin.org / get发出GET请求,该网站从服务器获取资源。

但是,如果我们看到我们创建的结果,我们将看到它的类型为HttpCommon.Response。 这意味着我们从服务器返回了一个响应对象。

进一步移动,值Response(200 OK,14个标题,正文中的281个字节)显示它在发出请求时是成功的,并且内容中有大约281个字节。 我们可以使用Julia中的fieldnames函数查看更多内容,这对于探索对象内的字段非常方便。

但是,当我们打印数据时,我们会看到它是UInt8格式,这是人类无法读取的。 因此,为了从数据中得出一些意义,我们需要通过使用函数convert将其转换为字符串,这很好地完成了它的工作。
同样,我们也可以使用Requests.post函数将数据POST到服务器:

julia> result = Requests.post("http://httpbin.org/post"; data = "this is
julia")
Response(200 OK, 14 headers, 436 bytes in body)
julia> JSON.parse(convert(String, result.data))
Dict{String,Any} with 8 entries:
"headers" => Dict{String,Any}(Pair{String,Any}("Connection",
"close"),Pair{St…
"json" => nothing
"files" => Dict{String,Any}()
"args" => Dict{String,Any}()
"data" => "this is julia"
"url" => "http://httpbin.org/post"
"form" => Dict{String,Any}()
"origin" => "35.188.142.162

Web框架

Julia的活跃社区在制作基于网络的软件包方面发挥着重要作用。 实际上,有一个完整的社区组负责处理所有基于Web的包,并且名为JuliaWeb,而他们的工作可以在https:/ / github.com / JuliaWeb找到。

然而,进入Web框架,有一个非常称职的框架名为Genie,根据其官方网站,它是一个全栈MVC Web框架,为开发现代Web应用程序提供了简化和高效的工作流程。 它建立在Julia的优势(高级,高性能,动态和JIT编译)的基础上,为高效的Web开发提供了丰富的API和强大的工具集

让我们首先安装软件包并创建一个基于Web的小功能应用程序。 该软件包易于安装,可以使用Julia的默认软件包管理器Pkg完成:

julia> Pkg.clone("https://github.com/essenciary/Genie.jl")

安装后可能需要一两分钟,然后您可以继续处理以开始使用该软件包:

julia> using Genie
julia> Genie.REPL.new_app("sample_julia_app")
2017-11-19T14:58:40.316 - info: Done! New app created at
/Users/rahullakhanpal/sample_julia_app
2017-11-19T14:58:40.331 - info: Looking for dependencies
2017-11-19T14:58:40.331 - info: Checking for Flax rendering engine support
2017-11-19T14:58:41.436 - info: Cloning Flax from
https://github.com/essenciary/Flax.jl
2017-11-19T14:58:45.018 - info: Computing changes...
2017-11-19T14:58:52.142 - info: No packages to install, update or remove
2017-11-19T14:58:52.142 - info: Finished adding dependencies
2017-11-19T14:58:52.142 - info: Starting your brand new Genie app - hang
tig
_____ _
| __|___ ___|_|___

| | | -_| | | -_|
|_____|___|_|_|_|___|
Starting Genie in >> DEV << mode using 1 worker(s)
genie>

请注意,shell最终将自己更改为Genie。 该应用程序在您的主目录中创建,并自动加载到shell中。 要查看应用程序的整体默认结构,请输出tree sample_julia_app

rahuls-MBP:~ rahullakhanpal$ tree sample_julia_app/
sample_julia_app/
├── LICENSE.md
├── README.md
├── REQUIRE
├── app
│ ├── assets
│ │ ├── css
│ │ │ └── application.css
│ │ ├── fonts
│ │ └── js
│ │ ├── application.js
│ │ └── channels.js
│ ├── helpers
│ │ ├── ControllerHelper.jl
│ │ ├── ValidationHelper.jl
│ │ └── ViewHelper.jl
│ ├── layouts
│ │ └── app.flax.html
│ └── resources
├── bin
│ ├── repl
│ └── server
├── cache
├── config
│ ├── app.jl
│ ├── database.yml
│ ├── env
│ │ ├── dev.jl
│ │ ├── prod.jl
│ │ └── test.jl
│ ├── initializers
│ │ ├── converters.jl
│ │ └── dependencies.jl
│ ├── loggers.jl
│ ├── plugins.jl
│ ├── routes.jl
│ └── secrets.jl
├── db
│ ├── migrations
│ └── seeds
├── docs
│ ├── make.jl
│ ├── mkdocs.yml
│ └── src
│ └── index.md
├── env.jl
├── genie.jl
├── lib
├── log
│ └── dev.log
├── package.json
├── public
│ ├── css
│ │ ├── bootstrap-theme.css
│ │ ├── bootstrap-theme.min.css
│ │ ├── bootstrap.css
│ │ ├── bootstrap.min.css
│ │ ├── dosis-font.css
│ │ ├── prism.css
│ │ ├── style.css
│ │ └── themify-icons.css
│ ├── error-404.html
│ ├── error-500.html
│ ├── favicon.ico
│ ├── favicon.png
│ ├── fonts
│ │ ├── dosis
│ │ │ ├── 3isE9muMMOq1K7TQ7HkKvIDGDUGfDkXyfkzVDelzfFk.woff2
│ │ │ ├── O6SOu9hYsPHTU43R17NS5XYhjbSpvc47ee6xR_80Hnw.woff2
│ │ │ ├── RPKDmaFi75RJkvjWaDDb0nYhjbSpvc47ee6xR_80Hnw.woff2
│ │ │ ├── VK-RlLrn4NFhRGqPkj6IwBkAz4rYn47Zy2rvigWQf6w.woff2
│ │ │ └── oaBFj7Fz9Y9_eW3k9Jd9X6CWcynf_cDxXwCLxiixG1c.woff2
│ │ ├── glyphicons-halflings-regular.eot
│ │ ├── glyphicons-halflings-regular.svg
│ │ ├── glyphicons-halflings-regular.ttf
│ │ ├── glyphicons-halflings-regular.woff
│ │ ├── glyphicons-halflings-regular.woff2
│ │ ├── themify.eot
│ │ ├── themify.svg
│ │ ├── themify.ttf
│ │ └── themify.woff
│ ├── img
│ │ ├── community.png
│ │ ├── contribute-2.png
│ │ ├── docs.png
│ │ ├── genie-sad.png
│ │ └── genie.png
│ ├── js
│ │ ├── ansi_up.js
│ │ ├── bootstrap.js
│ │ ├── bootstrap.min.js
│ │ ├── jquery.easing.min.js
│ │ ├── jquery.min.js
│ │ ├── prism.js
│ │ ├── scrolling-nav.js
│ │ ├── static.js
│ │ └── validator.js
│ ├── robots.txt
│ └── welcome.html
├── session
├── task
│ └── LintFilesTask.jl
├── test
│ └── test_config.jl
└── webpack.config.js
29 directories, 75 files

要配置应用程序,请转到$ HOME / sample_julia_app / config /路径,打开routes.jl文件,并将以下内容添加到其中:

using Router
route("/julia") do
"My first julia web app"
end

完成后,保存文件并导航回REPL中的Genie shell:

genie> AppServer.startup()
Listening on 0.0.0.0:8000...

打开浏览器并转到http://0.0.0.0:8000/julia链接,它将为您提供我的第一个julia网络应用程序作为页面上的响应:
这里写图片描述

如果您偶然导航到任何其他URL,您将看到错误页面,如以下屏幕截图所示:
这里写图片描述

概要

在本章中,我们讨论了各种主题,包括对RDBMS和NoSQL等数据库的介绍,以及如何将它们与Julia一起使用。 我们探讨了如何使用Julia连接数据库。 在本章的最后一部分中,我们继续了解基于REST的系统背后的想法,以及如何使用Julia中的Genie.jl创建一个RESTful服务以及一个Web应用程序。

在下一章中,我们将更深入地了解Julia下的内容以及它们的工作方式。 我们还将在Julia编写代码时了解一些性能提示。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值