I want to create a table in ets if it does not exists . How can I check if this named exists or not ?
Asked
Active
Viewed 3,515 times
8
-
I recommend to create it in try..catch expression. – Pouriya Mar 13 '19 at 00:03
4 Answers
15
You can use :ets.whereis/1
. It will return :undefined
if the named table does not exist:
iex(1)> :ets.new :foo, [:named_table]
:foo
iex(2)> :ets.whereis :foo
#Reference<0.2091350666.119668737.256142>
iex(3)> :ets.whereis :bar
:undefined

Dogbert
- 212,659
- 41
- 396
- 397
-
iex(14)> :ets.new :foo, [:named_table] :foo iex(15)> :ets.whereis :foo ** (UndefinedFunctionError) function :ets.whereis/1 is undefined or private (stdlib) :ets.whereis(:foo) – Arun Dhyani Aug 30 '18 at 10:54
-
2What version of Erlang are you on? You can also try `:ets.info(:foo)`. – Dogbert Aug 30 '18 at 11:13
-
1
1
If you're on an older version of Erlang, you can create a lookup function:
def lookup(server, name) do
case :ets.lookup(server, name) do
[{^name, pid}] -> {:ok, pid}
[] -> :error
end
end
Information taken from: https://elixir-lang.org/getting-started/mix-otp/ets.html

Clinton
- 313
- 1
- 5
1
Your best best is just to see if the table is in the list of all tables. A check as simple as this should be good:
lists:member(table_name,ets:all())
This returns a simple boolean() that you can use in a case to base actions on.

Woody14619
- 51
- 4
0
This should do the trick:
def create_table? do if Enum.member?(:ets.all(), :my_table) == false do :ets.new(:my_table, [:public, :named_table]) end end

Maxximiliann
- 35
- 5