You are on the right track, you will need to have a dummy column but
you need to commit the database close the database and then reload at
every major step.  here is a small script that you can test with.

I don't think that there is an efficient way of doing this, but here
is A way of doing it :)

import metakit, os

# changes table.b from str to int

# make some data to test
if os.path.exists("foo.mk"): os.remove("foo.mk")
st = metakit.storage("foo.mk", 1)
vw = st.getas("test[a,b,c]")
vw.append(('a','1','c'))
vw.append(('d','2','f'))
st.commit()
del st

print "converting b to newb"
st = metakit.storage("foo.mk", 1)
vw = st.getas("test[a,b,c,newb:I]")
for row in vw:
    row.newb = int(row.b)

# drop the 'b' column
vw = st.getas("test[a,c,newb:I]")
st.commit()

del st

st = metakit.storage("foo.mk", 1)
# add the b column back as an integer
vw = st.getas("test[a,b:I,c,newb:I]")
for row in vw:
    row.b = row.newb
# drop the newb column!
vw = st.getas("test[a,b:I,c]")
st.commit()

del st

# all done, now test
st = metakit.storage("foo.mk", 1)
vw = st.view("test")
metakit.dump(vw)

# you should
st.save(open("foo2.mk", "wb"))
# as this optimizes the on-disk representation
_____________________________________________
Metakit mailing list  -  [email protected]
http://www.equi4.com/mailman/listinfo/metakit

Reply via email to