Как подключиться к MemSQL из Elixir

MemSQL бинарно совместим с Mysql и использует те же драйверы. Однако эта приятная теория не применима, когда вы подключаетесь из Elixir с помощью mariaex или mysqlex.

С mariaex я могу нормально подключиться: введите здесь описание изображения

но я не могу сделать запрос из-за проблемы с enable_binary_protocol:

введите здесь описание изображения

Включение бинарного протокола в memsql.cnf для типа агрегатора работает для некоторых коротких запросов, но не для более длинных. Во-первых, после редактирования memsql.cnf для включения строки «enable_binary_protocol=true» и перезапуска кластера с помощью «memsql-ops memsql-restart» я проверил, что параметр действительно установлен:

введите здесь описание изображения

И теперь некоторые вещи работают, но не другие:

введите здесь описание изображения

Кстати, этот запрос отлично работает в интерфейсе командной строки memSQL:

введите здесь описание изображения

Тем временем драйвер mysqlex даже не подключается:

введите здесь описание изображения

Так что я в основном в тупике. Кто-нибудь успешно использует Elixir с memSQL? Если да, то какой секретный ингредиент?

Одним из вариантов может быть использование библиотеки Erlang. Этот (также доступен в Hex) может быть хорош, но я понятия не имею, как вызывать функции Erlang из Elixir. Самое близкое, что я получил, это успешно скомпилировать его в iex после добавления зависимости {:mysql, "~> 1.0"} в мой mix.exs.


person Thomas Browne    schedule 24.03.2017    source источник


Ответы (2)


У меня нет опыта работы с MemSQL, но он выглядит как 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)

Дополнительные сведения см. в официальном ускоренном курсе по Erlang/Elixir.

person Sheharyar    schedule 02.04.2017

См. http://docs.memsql.com/docs/prepared-statements. Должна быть настройка клиента для использования только подготовленных операторов на стороне клиента - многие примеры перечислены на этой странице. Это рекомендуемый способ подключения таких клиентов.

person Jack Chen    schedule 24.03.2017
comment
Я видел этот список документов, но не знаю, какой из этих mariex и/или mysqlex используют. На самом деле я не уверен, что они используют какую-либо из них, потому что обе являются чистыми библиотеками эликсира. - person Thomas Browne; 24.03.2017