On Wed, Sep 8, 2010 at 00:14, dls <[email protected]> wrote:
> All - I'm working on a simple migration script for Elixir based
> databases, and I've run into some issues. While I was creating a demo
> script to illustrate these issues so I could post to this group, I ran
> into another problem that I think may be related. Below is a simple
> script that creates some entries in an Elixir/sqlite database, dumps
> them into a RAM structure, and then attempts to load them into a
> different database. In this sample script, both databases use the same
> database schema (version).
>
> Also, the script can be viewed/downloaded here:
>
> http://bitbucket.org/dls/elixir_dump_test/src/tip/dumpTest.py
>
> The code is:
>
> #****************************************************************************
> from elixir import *
>
> dict= {}
>
> class User(Entity):
>    using_options(tablename='User')
>    name         = Field(String, unique=True)
>    expenses     = OneToMany('Expense')
>
>    def __repr__(self):
>        return "<User ('%s', '%s')>" % (self.id, self.name)
>
> class Expense(Entity):
>    using_options(tablename='Expense')
>    user         = ManyToOne('User')
>    amount       = Field(Float)
>
>    def __repr__(self):
>        return "<Expense ('%s', '%s')>" % (self.id, self.amount)
>
> # connect
> connString = 'sqlite:///' + 'dumpTest.db'
> metadata.bind = connString
> setup_all()
> create_all()
>
> # create some data
> u1 = User(name='John Doe')
> u2 = User(name='Jane Doe')
> e1 = Expense(user=u1, amount='15.01')
> e2 = Expense(user=u2, amount='50.25')
> session.commit()
>
> # dump to dict
>
> dict['User'] = User.query.all()
> print dict['User']
> dict['Expense'] = Expense.query.all()
> print dict['Expense']
>
> # close session
> session.close()
> cleanup_all()

Here is the problem. After using cleanup_all, you cannot use any
entities you have used so far again, because they were all "unmapped",
so you basically have simple python objects without any database link.
It is intended for testing purposes only: you cleanup everything so
that one test does not leak anything to the next test. session.close()
should be enough in your case I think.

> # connect to db #2
> connString = 'sqlite:///' + 'dumpTest2.db'
> metadata.bind = connString
> setup_all()

And this does nothing since cleanup_all cleared the list of entities.
So yeah, it sets up all entities you have defined since that call to
setup_all... That is: nothing.

> create_all()
>
> for i in dict['User']:
>    u = User()
>    u.name = i.name # works

It only *seems* to work... SQLAlchemy's machinery is not triggered as
you would expect, since the class is "unmapped".

-- 
Gaëtan de Menten

-- 
You received this message because you are subscribed to the Google Groups 
"SQLElixir" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sqlelixir?hl=en.

Reply via email to