Eliir Ecto: 在Postgresql中插入二进制数据

本文以用一个在数据库中保存图片信息为例, 展示如何向 Postgresql 中插入二进制数据.首先我们要知道 Postgresql 中唯一一种二进制数据的类型为 bytea, 表示字节数组或字节序列. 对应于Oracle和MySQL中的 blob.下面是一个示例defmodule Bytea.Model.Test doimport Ecto.Changesetuse Ect

本文以用一个在数据库中保存图片信息为例, 展示如何向 Postgresql 中插入二进制数据.

首先我们要知道 Postgresql 中唯一一种二进制数据的类型为 bytea, 表示字节数组或字节序列. 对应于Oracle和MySQL中的 blob.

下面是一个示例

defmodule Bytea.Model.Test do
import Ecto.Changeset
use Ecto.Schema
alias Bytea.Repo
schema "tests" do
field :photo, :binary
timestamps()
end

def changeset(struct, params \ %{}) do
struct
|> cast(params, [:photo])
|> validate_required([:photo])
end

def insert(map) do
Map.merge(%MODULE{}, map) |> Repo.insert
end

def test_insert do
{:ok, contents} = File.read("/tmp/FB7D22A5-924E-4DA5-AC93-5D815FA1AEA8.png")
insert(%{photo: contents})
end
end
迁移脚本

defmodule Bytea.Repo.Migrations.CreateTest do
use Ecto.Migration

def change do
create table(:tests) do

这里也可以为 :binary, 实际上在执行 mix ecto.migrate 数据库中:photo字段的类型就是:bytea

  add :photo, :bytea  timestamps()end

end
end
当然, 除了图片文件以外, 你还可以存储其他格式的二进制文件, 比如Word文档, PDF文档等等.

实验步骤

  1. mix phoenix.new bytea --no-brunch
    创建项目, 提示下载依赖, 输入 Y

  2. mix compile
    编译项目

  3. vi config/dev.exs
    配置数据库, 默认生成的用户名和密码都是postgres,所以在测试的时候把你的数据库用户名和密码设置成postgres是非常方便的.

  4. mix ecto.setup
    创建数据库和表, 这个命令实际上是在mix.exs中定义的别名,包含多个子命令

  5. iex -S mix phoenix.server
    启动测试

示例地址

https://github.com/developerw...

测试的时候可以随便找一个文件放到这个位置 "/tmp/FB7D22A5-924E-4DA5-AC93-5D815FA1AEA8.png"

关键字:elixir, ecto