如何从 Elixir 连接到 MemSQL

How do I connect to MemSQL from Elixir

MemSQL is binary compatible with Mysql and uses the same drivers. However this nice-in-theory does not seem to apply when you connect from Elixir with mariaex or mysqlex

使用 mariaex,我可以正常连接:

但由于 enable_binary_protocol 问题,我无法查询:

在 memsql.cnf 中为聚合器类型启用二进制协议适用于一些较短的查询,但不适用于较长的查询。首先,在编辑 memsql.cnf 以包含行 "enable_binary_protocol=true" 并使用 "memsql-ops memsql-restart" 重新启动集群后,我检查了参数确实已设置:

现在有些东西可以用,但有些不行:

顺便说一句,该查询在 memSQL 命令行界面中运行良好:

同时,mysqlex 驱动程序甚至没有连接:

所以我基本上被难住了。有人成功地将 Elixir 与 memSQL 一起使用了吗?如果有,秘诀是什么?

一种选择可能是使用 Erlang 库。 This one (also available on Hex) 可能不错,但我不知道如何从 Elixir 调用 Erlang 函数。我得到的最接近的是在将依赖项 {:mysql, "~> 1.0"} 添加到我的 mix.exs 后在 iex 中成功编译它。

参见 http://docs.memsql.com/docs/prepared-statements。应该有一个客户端设置只使用客户端准备好的语句——该页面上列出了许多示例。这是让此类客户端连接的推荐方法。

我对 MemSQL 没有任何经验,但它 does look like mysql-otp 在客户端准备查询语句。您可以尝试这样使用它:

# Connect
{:ok, pid} = :mysql.start_link(host: 'localhost', user: 'foo', password: 'hello', database: 'test')

# Select
{:ok, columns, rows} = :mysql.query(pid, "SELECT * FROM mytable WHERE id = ?", [1])

# Transactions
result = :mysql.transaction(pid, fn ->
  :ok = :mysql.query("INSERT INTO mytable (foo) VALUES (1)")
  raise "foo"
  :ok = :mysql.query("INSERT INTO mytable (foo) VALUES (1)")
end)

有关详细信息,请参阅 official Erlang/Elixir crash course