[erlang-questions] mnesia:transform_table
Håkan Mattsson
hawk.mattsson@REDACTED
Wed Nov 25 14:40:21 CET 2009
It looks like you have done the right thing. Perhaps you have
simplified your code too much in order to post it on the list?
I tried to reproduce your error, but it worked for me.
See the printouts and the test program below.
/Håkan
16> foo:go(foo).
Before: [{old,7,49},
{old,6,36},
{old,4,16},
{old,1,1},
{old,9,81},
{old,10,100},
{old,8,64},
{old,2,4},
{old,3,9},
{old,5,25}]
Before: [{new,7,49,42},
{new,6,36,42},
{new,4,16,42},
{new,1,1,42},
{new,9,81,42},
{new,10,100,42},
{new,8,64,42},
{new,2,4,42},
{new,3,9,42},
{new,5,25,42}]
ok
-module(foo).
-compile([export_all]).
-record(old, {key, val}).
-record(new, {key, val, extra}).
go(Tab) ->
mnesia:delete_table(Tab),
{atomic, ok} = mnesia:create_table(Tab, [{attributes,
record_info(fields, old)},
{record_name, old}]),
[mnesia:dirty_write(Tab, #old{key = K, val = K*K}) || K <- lists:seq(1,10)],
io:format("Before: ~p\n", [ets:tab2list(Tab)]),
Transformer =
fun(#old{key = Key, val = Val}) ->
#new{key = Key, val = Val, extra = 42}
end,
{atomic, ok} = mnesia:transform_table(Tab, Transformer,
record_info(fields, new),
new),
io:format("Before: ~p\n", [ets:tab2list(Tab)]).
On Wed, Nov 25, 2009 at 2:07 PM, andrew mmc <andrewmmc@REDACTED> wrote:
> Hello,
>
> I needed to change the structure of an mnesia table. I followed the example
> in the documentation:
>
> -record(old, {key, val}).
> -record(new, {key, val, extra}).
>
> Transformer =
> fun(X) when record(X, old) ->
> #new{key = X#old.key,
> val = X#old.val,
> extra = 42}
> end,
> {atomic, ok} = mnesia:transform_table(foo, Transformer,
> record_info(fields, new),
> new)
>
> Substituting the record names and field mappings as per my
> requirement. The transformation function works fine when I test it on
> a record of the old type, outputting the new record ok.
>
> However, now when I try to read from the new table, mnesia reports
> no_exists, and the old table still exists but reads as empty... Where
> has my data gone?!
>
> Any help much appreciated!
>
> Regards,
>
>
> Andrew
On Wed, Nov 25, 2009 at 2:07 PM, andrew mmc <andrewmmc@REDACTED> wrote:
> Hello,
>
> I needed to change the structure of an mnesia table. I followed the example
> in the documentation:
>
> -record(old, {key, val}).
> -record(new, {key, val, extra}).
>
> Transformer =
> fun(X) when record(X, old) ->
> #new{key = X#old.key,
> val = X#old.val,
> extra = 42}
> end,
> {atomic, ok} = mnesia:transform_table(foo, Transformer,
> record_info(fields, new),
> new)
>
> Substituting the record names and field mappings as per my
> requirement. The transformation function works fine when I test it on
> a record of the old type, outputting the new record ok.
>
> However, now when I try to read from the new table, mnesia reports
> no_exists, and the old table still exists but reads as empty... Where
> has my data gone?!
>
> Any help much appreciated!
>
> Regards,
>
>
> Andrew
More information about the erlang-questions
mailing list