语言phoenix 开发API系列(三)phoenix api 结合数据库

概述

介绍了 api 的各种写法之后,下面介绍构建 api 时与数据库连接的法门。

下面采用的工程的整体代码都明白于:
http://git.oschina.net/wangyubin/phoenix-api

《西方思想的来自》聂敏里

本篇源于在看罢聂敏里之《西方思想之来源》之后,我个人对邓晓芒与聂敏里所说之有关古希腊哲学传统的初始了解。

ecto 简介

ecto 其实是独立于 phoenix framework 的,它是 elixir
语言实现的用于访问数据库的框架,类似于 ORM 但是与风土人情的 ORM
又有些不均等。 可以这样理解,它是以了 elixir
语言的动态性和函数式的特征,参考了民俗的 ORM
的优势后如支付的初一代数据库访问层。

古希腊哲学的习俗是呀?

邓晓芒说凡是自然哲学和本体论。
聂敏里就是形而上学和认识论。

ecto 的季个基本点组件

  1. Ecto.Repo 数据库包装器, 通过她好推行数据库的增删改查,
    通过其配备数据库连接
  2. Ecto.Schema 这是 ORM 的中坚,定义了操作对象和底部数据库表之间的照
  3. Ecto.Changeset 这是 Ecto 的一个创新的地方,在 Changeset
    中,可以定义校验数据层合法性的计,在真正写副数据库之前,对数据开展校验
  4. Ecto.Query 因 elixir 语法编写的询问,可以避 SQL 注入等常见问题

第一我们来家喻户晓其中几个概念的意义。

自然哲学,即古希腊时期所说的物理学。它研究之是用作整体的宇宙万物,也便是天地的浮动与当之原等题材。

机械(Metaphysics),即首先哲学,专门研究“存在”本身以及“存在”凭借温馨之本性而享有的那些属性的对。原出自亚里士多道同管著作的称号,因为马上按照开于布置在外研究自然哲学的写《物理学》的末端,所以还要如物理学之后。

本体论(Ontology),即探究世界之本原的哲学理论,研究的即是“什么是‘存在(on)’”的题目。

认识论,即研究是否认识,及如何赢得认识的题材。

ecto 使用示例

本体论传统

泰勒斯——巴门尼德——亚里士多道

其奥尼亚地区的几位哲学家都管同种运动的标准化作自己所当的本来,不管是泰勒斯有流动性的“水”还是赫拉克利特于定之口径上燃烧的“火”,都不同让新兴元素论者提出的因素。与其说它是一模一样栽素形态,倒不如说是故来表示一种植运动转化的准绳。

倘从毕达哥拉斯提出“数凡是万物之原”,已经隐隐有了退现象转向抽象思维的自由化,而巴门尼德则正式提出了“存在”。

当巴门尼德前面的自然哲学家们,关注之是移动变化之标准化。自他今后,人们开始关注大不动的本来。巴门尼德作自然哲学到机械的转会,开启了关于“存在”的教条的纪念。

外自此的哲学家,则开始利用抽象思维思考“存在”究竟是啊。柏拉图说是“理念”,亚里士多德把“实体”作为自己体系中的本,把“神”作为高的实业。

故此,本体论的发展于古希腊之率先位哲学家,一直到后期希腊哲学之前,作为希腊哲学研究的端倪肯定是有效的。

创办示范工程

  • 新建工程

    $ mix new ecto_sample

  • 补给加依赖 (mix.exs)

    defp deps do
    [

    {:postgrex, ">= 0.0.0"},
    {:ecto, "~> 2.0.0"}
    

    ]
    end

  • 设置以信息 (mix.exs)

    def application do
    [applications: [:logger, :postgrex, :ecto]]
    end

  • 获得依赖包

    $ mix deps.get

认识论传统

赫拉克利特——巴门尼德——智者学派——德谟克利特——柏拉图——亚里士多德——古代怀疑主义

认识论的目标是有关什么得到知识,而那高高的的学问就是有关终极“存在”的文化。而机械的钻对象也是终端“存在”。

赫拉克利特大约能算是西方哲学史上先是个事关认识论的哲学家,他提出“自然习惯被藏身”,充分肯定了经感官得到认识的必要性,主张从感觉和言语材料的正确理解中,把握作为该内在精神的“逻各斯”。

巴门尼德则将备感跟纸上谈兵思维分离开来。把向“存在”的心劲思维称为“真理的路”,把感觉更称为“意见的路”,否定了打感觉得到真理的可能性。后来,开启了决定整个西方哲学传统2500大多年之拱卫现象以及真相就同样主题地长期的认识问题之议论。

他从此的恩培多克勒及阿那克萨戈拉独家提出了“同类相知”和“异类相知”的标准。

智者学派则彻底把感觉上升至断的水平,普罗泰戈拉提出“人是万物的规则”,主张为单个人之私家感觉当衡量一切事物的条件。而别一样位智者学派的表示人物高尔吉亚,也看认识有如乘各种感觉,又经三单关于“存在”的论证否认了“存在”可以被考虑认识的可能性。

德谟克利特的哲学活动仍时间以苏格拉底下,因此我们位于智者学派之后讨论。他个别提出了“影像”说与“约定论”,将知识分为有限看似,一像样经过理智得来,是真实的;另一样近似经过感官得来,是虚的。总得来说,这或沿袭着巴门尼德的“真理的路”和“意见的路”的别,轻视感觉,重视理性,并且存有不可知论的色彩。

苏格拉底提出“德性即文化”,主张用辩证法,通过持续地责问以达成认识真理的目的。

柏拉图则将会世界和可感世界到底分手,主张通过回顾说跟灵魂转向来取知识。

亚里士多道把灵魂三分,分别是营养灵魂、感觉灵魂、理智灵魂,感觉灵魂具有感觉能力接受可感形式,理智灵魂有思维能力认识可知形式。

先怀疑主义则矢口否认了整整非确定的痛感更,主张悬搁判断。

尽管前苏格拉底哲学的目的在获取有关高本原的知识,但他俩基本上都是独断的,没有通过逻辑推导。他们把感觉当文化,主要讨论的且是深感被认识的可能性。

截至巴门尼德把场景与真相分离开来,知识之可能为没得到讨论。而到了智者学派,知识问题才起及讨论的圈。在此之后,从苏格拉底暨亚里士多道立三替哲学家都是由理性出发,围绕文化问题使进展的好的盘算。

出于在自然哲学中认识论的题材并未进入讨论,主要是因感觉主义存在的,而智者学派以后才登感觉跟理性之涉及问题的沉思。自然哲学到古典时期的希腊哲学主要是从宇宙论过度到本体论,这无异于时也可说凡是本体论或形而上学的形成时。但按照感觉主义到理性主义的认识论,我们呢是可以主导以古希腊哲学整理出一个框架的。

谢开心提供的图

希腊哲学始终为博取有关本的知识为高的优质,而自然哲学却一味局限为感性经验的园地,但形而上学主张通过理性认识达到这种高的认识。因此,从认识目的及来说,自然哲学和教条主义是一致的。但由感觉到理性之认深度来说,自然哲学则是形而上学的前身,也尽管是前形而读。而在议论古希腊的哲学问题达成,因为形而上学和本体论都是关于“存在”的学问,加上这种研究还不够深入,本体论实际上是富含在照本宣科研究里的。

邓晓芒所说之古希腊哲学传统,即“自然哲学和本体论”,实际上就是是管古希腊哲学分为两个阶段,即自然哲学到机械的一个演变过程,也就是研究对象由反的景如何到不动的原来,具体来说就是泰勒斯——巴门尼德——亚里士多道,巴门尼德于里边当自然哲学到机械转变过程中的一个转速点,奠定了于自然哲学转向形而上学本体论的风土民情。

只是我们从自然哲学到本体论的钻研对象变化来拘禁,自然哲学把握的目标是改的情景,本体论则是关于非动的“存在”,由景如何认识精神之认识论问题,实质上啊不怕是含在自然哲学——形而上学的演化过程遭到之。

聂敏里的“形而上学和认识论”传统,是由里外两只面来对古希腊哲学的前进。他拿自然哲学看成是形而上学的一个方面,而尽希腊哲学的升华,是教条主义研究对象“存在”的逐月树立,和如何认识这个“存在”的经过。但是,外于研讨着又独自把认识论从形而上学中切割裂开来。实际认识论在古希腊,就是思考思维能否认识“存在”的题目,也即是怎么由景中把握精神,从而达成对最高知识——关于“存在”的认识。因为精神和景象属于形而上学基本层面的概念,很显然,古希腊的认识论就是教条主义的同一有。形而上学的上进,绕不上马认识论的题材。而认识论后来于形而上学中分别出来,则是自从笛卡尔始发之。

每当当下点儿种理解之下,我道简单栽说法都各起那中心,主要是解的题目,并不曾孰之学术水平重复强的题材。我个人认为,在古希腊时代:机械=本体论+认识论,总的来说,古希腊哲学传统精神上或一样种形而上学发展进程。

数据库连接配置

# vi config/config.exs
config :ecto_sample, ecto_repos: [EctoSample.Repo]

config :ecto_sample, EctoSample.Repo,
  adapter: Ecto.Adapters.Postgres,
  database: "ecto_sample",
  username: "iotalab",
  password: "iotalab",
  hostname: "localhost"

安排好数据库连接之后,就可以于指令行下创建数据库了

$ mix ecto.create

创建 model 和 migration 代码

第一,通过命令执行创建一个就此来生成表的的 users module。

$ mix ecto.gen.migration users

以此命令会在 priv/repo/migrations 下自动生成 migration
脚本,只不过脚论是空的。 下面先创造 users 表的始末,然后填充 migration
脚本的内容

# vi lib/ecto_models.ex
defmodule EctoSample.User do
  use Ecto.Schema

  schema "users" do
    field :name, :string
    field :password, :string
    field :age, :integer

    timestamps
  end
end

# vi priv/repo/migrations/20160912131700_users.exs  这个文件是由上一条命令产生的
defmodule EctoSample.Repo.Migrations.Users do
  use Ecto.Migration

  def up do
    create table(:users) do
      add :name, :string
      add :password, :string
      add :age, :integer
      timestamps
    end
  end

  def down do
    drop table(:users)
  end
end

创造数量库表

缔造命令非常简单

$ mix ecto.migrate

应用示例

始建了一个简单的表明后,就得于指令行下测试是否足以操作数据库了。
下面演示了新增一个 user 和 删除一个 user 的过程。

$ iex -S mix
Erlang/OTP 19 [erts-8.0.2] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir (1.3.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> u = %EctoSample.User{name: "wyb", password: "passwd", age: 33}
%EctoSample.User{__meta__: #Ecto.Schema.Metadata<:built, "users">, age: 33,
 id: nil, inserted_at: nil, name: "wyb", password: "passwd", updated_at: nil}


iex(2)> EctoSample.Repo.insert(u)

22:09:51.433 [debug] QUERY OK db=4.4ms
INSERT INTO "users" ("age","name","password","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5) RETURNING "id" [33, "wyb", "passwd", {{2016, 9, 12}, {14, 9, 51, 0}}, {{2016, 9, 12}, {14, 9, 51, 0}}]
{:ok,
 %EctoSample.User{__meta__: #Ecto.Schema.Metadata<:loaded, "users">, age: 33,
  id: 3, inserted_at: #Ecto.DateTime<2016-09-12 14:09:51>, name: "wyb",
  password: "passwd", updated_at: #Ecto.DateTime<2016-09-12 14:09:51>}}


iex(3)> u = %EctoSample.User{id: 3}
%EctoSample.User{__meta__: #Ecto.Schema.Metadata<:built, "users">, age: nil,
 id: 3, inserted_at: nil, name: nil, password: nil, updated_at: nil}


iex(4)> EctoSample.Repo.delete(u)

22:11:28.960 [debug] QUERY OK db=3.4ms
DELETE FROM "users" WHERE "id" = $1 [3]
{:ok,
 %EctoSample.User{__meta__: #Ecto.Schema.Metadata<:deleted, "users">, age: nil,
  id: 3, inserted_at: nil, name: nil, password: nil, updated_at: nil}}

补给说明

除此之外修改者的文本以外,还有下面2独地方得改,否则 EctoSample
模块不会见加载:

# vi lib/ecto_sample.ex
defmodule EctoSample do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    children = [
      worker(EctoSample.Repo, []),
    ]
    opts = [strategy: :one_for_one, name: EctoTest.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

def application do
  [applications: [:logger, :postgrex, :ecto],
   mod: {EctoSample, []}]   # <===  IMPORTANT !!!
end

api with postgresql

postgresql 安装和部署

以下安装配备是基于 CentOS7 的

# 安装 package
$ sudo yum install postgresql-server

# init db
$ sudo su - postgres
$ initdb -D /var/lib/pgsql/data

# start db
$ sudo systemctl start postgresql

# create user and database
$ sudo su - postgres
$ psql -U postgres -W       # password is also "postgres"
postgres=# CREATE USER iotalab WITH PASSWORD 'iotalab';
postgres=# CREATE DATABASE test OWNER iotalab ENCODING 'UTF8';

安好局域网内访问

$ sudo su - postgres 
$ cd /var/lib/pgsql/data

vim pg_hba.conf

host    all             all             0.0.0.0/0            md5

vim postgresql.conf

listen_addresses = '*'

长距离连接不达标时时试禁用 iptables

$ sudo systemctl stop iptables

缔造 数据库与阐发

  1. 吃这工程长 数据库的支撑
    其实创建的工程的时候,默认就是支撑数据库的。但是前的演示不需要数据库,所以创建是工程的早晚用了
    –no-ecto 的参数。
    重新创设工程,并将都写的代码复制进去即可,这次创建工程时不加
    –no-ecto 参数。

    $ mix phoenix.new phoenix_api
    
  2. 布置数据库连接并创造数据库 修改文件 config/dev.exs

    # Configure your database
    config :phoenix_api, PhoenixApi.Repo,
      adapter: Ecto.Adapters.Postgres,
      username: "iotalab",
      password: "iotalab",
      database: "dev_db",
      hostname: "localhost",
      pool_size: 10
    

    创办数据库

    $ mix ecto.create
    
  3. 创造同布置用来测试的申

    $ mix phoenix.gen.model User users name:string email:string age:integer
    * creating web/models/user.ex
    * creating test/models/user_test.exs
    * creating priv/repo/migrations/20160913230129_create_user.exs
    

    查阅转的公文,已经因命令行的丁参数,生成了相应的靶子,可以窥见其间自动添加了
    timestamps 方法,这个主意是电动抬高一些 updated_at, inserted_at
    等通用时间字段。 然后通过命令行创建表:

    $  mix ecto.migrate
    
    07:10:52.527 [info]  == Running PhoenixApi.Repo.Migrations.CreateUser.change/0 forward
    
    07:10:52.527 [info]  create table users
    
    07:10:52.537 [info]  == Migrated in 0.0s
    

增删改查 示例

在测试代码中构造了 增删改查 的测试 case,然后用 mix test
命令来开展测试。
具体代码可以参考:http://git.oschina.net/wangyubin/phoenix-api/blob/master/test/models/user_test.exs

总结

动用 ecto 模块,操作数据库非常简单,但是,写岀优秀 api 的第一要在
api
的筹划上,学习是框架的含义是介于管一些通用繁琐的工作交给框架来处理,可以吃咱将主要的精力在工作代码的构建上。

从那之后,phoenix framework api 系列的3首也结束了。

来源:http://blog.iotalabs.io/

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图