我有一个upsert要求,所以我需要调用postgres存储过程或使用公用表表达式.我还使用pgcrypto exgtension进行密码,并希望使用postgres函数(例如"crypt"来编码/解码密码).
但是我无法找到一种方法让Ecto部分或全部使用原始sql,它是否意味着ecto只支持elixir dsl并且当dsl不够时不允许shell-out到原始sql?
我发现我可以通过适配器查询(Rocket是应用程序的名称)
q = Ecto.Adapters.Postgres.query(Rocket.Repo,"select * from users limit 1",[])
Run Code Online (Sandbox Code Playgroud)
但不确定如何将其转化为模型.我是elixir的新手,似乎我应该可以使用Ecto.Model.Schem.schema/3但是失败了
Rocket.User.__schema__(:load,q.rows |> List.first,0)
** (FunctionClauseError) no function clause matching in Rocket.User.__schema__/3
Run Code Online (Sandbox Code Playgroud) 如何在ELixir中记录地图/结构类型而不必实现protocol String.Chars?
require Logger
Logger.debug %{my: "map"}
** (Protocol.UndefinedError) protocol String.Chars not implemented for %{my: "map"}
(elixir) lib/string/chars.ex:3: String.Chars.impl_for!/1
(elixir) lib/string/chars.ex:17: String.Chars.to_string/1
Run Code Online (Sandbox Code Playgroud) 我正试图从V1 uuid中提取时间戳,天真地希望这有效:
select '3efe0a20-f1b3-11e3-bb44-14109fec739e'::uuid::timestamp;
Run Code Online (Sandbox Code Playgroud)
这是一个快速示例,展示如何提取时间,但我希望postgresql内置一些内容而不是创建一次性pl/pgSql函数.http://play.golang.org/p/XRCooLgfaG
该程序的输出是map[],但我想要map[Id:true name:true]
我正在尝试干燥一些 SQL CRUD 代码,并认为嵌入一个处理数据库读写的持久性结构会很好。在下面的示例中,持久性结构将是内部,我的模型将是外部。谢谢!
http://play.golang.org/p/fsPqJ-6aLI
package main
import (
"fmt"
"reflect"
)
type Inner struct {
}
type Outer struct {
Inner
Id int
name string
}
func (i *Inner) Fields() map[string]bool {
typ := reflect.TypeOf(*i)
attrs := make(map[string]bool)
if typ.Kind() != reflect.Struct {
fmt.Printf("%v type can't have attributes inspected\n", typ.Kind())
return attrs
}
// loop through the struct's fields and set the map
for i := 0; i < typ.NumField(); i++ {
p := …Run Code Online (Sandbox Code Playgroud) 我经常想从我的程序代码中复制/粘贴sql并在psql中测试/调试,并且必须用文字值替换位置参数是很繁琐的.有一个很好的转换方式:
select * from users where name=$1 and email=$2;
Run Code Online (Sandbox Code Playgroud)
至:
select * from users where name='troy' and email='t@me.com';
Run Code Online (Sandbox Code Playgroud) 我几乎在每个请求上都从数据库中获取用户(带有配置文件关联等).我想缓存在服务器上并保存数据库一些额外的工作.最初考虑Redis或Memcached,最终由Mnesia支持分布式缓存.
我知道如何进行传输(在Redis/Memcache的情况下将二进制文件传输到缓存后端)但是如何将模型序列化和反序列化为二进制文件?
有没有办法将地图和(莲花)路由器命名空间一起使用?下面是config.ru我试图作为演示运行的示例.
require 'bundler'
Bundler.require
module Demo
class Application
def initialize
@app = Rack::Builder.new do
map '/this_works' do
run Proc.new {|env| [200, {"Content-Type" => "text/html"}, ["this_works"]]}
end
map '/api' do
run Lotus::Router.new do
get '/api/', to: ->(env) { [200, {}, ['Welcome to Lotus::Router!']] }
get '/*', to: ->(env) { [200, {}, ["This is catch all: #{ env['router.params'].inspect }!"]] }
end
end
end
end
def call(env)
@app.call(env)
end
end
end
run Demo::Application.new
Run Code Online (Sandbox Code Playgroud) 我需要像 PubSub 这样的东西,但不是向所有订阅者广播,而是只将消息发送给 1 个订阅者(最好根据接收缓冲区中的消息数量自动选择订阅者,越低越好)。
我正在尝试使用受控数量的分布式工作人员发送数十万个 http 请求。
从数据库加载日期/时间类型时,Ecto将转换为Ecto.DateTime类型.从JSON字符串加载模型时,如何应用相同类型的转换
defmodule Rocket.User do
use Rocket.Model
schema "users" do
field :created_at, :datetime
field :name, :string
field :email, :string
field :password, :string
field :timezone, :string
end
end
iex(40)> Poison.decode!(~s({"created_at":"2015-01-21T06:05:10.891Z"}), as: Rocket.User)
%Rocket.User{created_at: "2015-01-21T06:05:10.891Z", email: nil, id: nil,
name: nil, password: nil, timezone: nil}
Run Code Online (Sandbox Code Playgroud) 对我来说,这看起来像是一个 postgresql (v9.4) 错误,或者这是预期的行为?-- 带有created_at的广告2015-02-06在表中,但不会出现在使用<=运算符的第二个查询中
addb=# select max(created_at)::date from ads;
max
------------
2015-02-06
(1 row)
addb=# SELECT created_at::date,
count(*) as num_ads,
'created'::text as "activity"
FROM ads where created_at>='2015-02-04'::date and
created_at<='2015-02-06'::date group by created_at::date;
created_at | num_ads | activity
------------+---------+----------
2015-02-04 | 1153 | created
2015-02-05 | 1230 | created
(2 rows)
Run Code Online (Sandbox Code Playgroud)