[PonyORM-list] Example with disconnect()

Goldberg, Arthur P arthur.p.goldberg at mssm.edu
Fri Dec 12 14:31:40 UTC 2014


Hi Alexander

Excellent idea, thanks!
But I don't find that the Entity definitions are available in db. E.g., your last line would error with

AttributeError: 'Database' object has no attribute 'Entity1'

And I looked inside all of db's attributes, and didn't find it.

On Dec 11, 2014, at 3:30 PM, Alexander Kozlovsky <alexander.kozlovsky at gmail.com<mailto:alexander.kozlovsky at gmail.com>> wrote:

Ok, I understand now. I suggest you to use the following pattern:

It is possible to define entities inside a function. Currently you place entity definitions in modules: moduleDefineEntitys1, moduleDefineEntitys2, etc. But inside each module you can write a function which will accept db object as a parameter and define entities for that db object. Then the application structure will look like this:

entities1.py - some of entities defined here inside define_entities() funciton:

    def define_entities(db):

        class MyEntity1(db.Entity):
            a = Required(int)
            b = Required(int)

        class MyEntity2(db.Entity):
            c = Required(int)
            d = Required(int)

entities2.py - other entities defined here inside define_entities() funciton:

    def define_entities(db)

        class MyEntity3(db.Entity):
            e = Required(int)
            f = Required(int)

        class MyEntity4(db.Entity):
            g = Required(int)
            h = Required(int)

all_entities.py  - this module define all entities inside define_entities() function:

    import entities1, entities2

    def define_entities(db):
        entities1.define_entities(db)
        entities2.define_entities(db)

geneticDBMScommon.py - contains `connect` function as in you current code:

    from pony.orm import *
    from all_entities import define_entities

    def connect(...):
        db = Database()  # create new database object
        define_entities(db)  # define entities for this database
        db.bind(...)  # bind this database
        ...
        return db

some_program.py - command line program which uses `connect` function:

    from pony.orm import *
    from geneticDBMSCommon import Connect

    db = Connect(...)  # get new database object
    theDB.db = db  # store db object to global variable if necessary

    with db_session:  # process data
        result = select(e for e in db.Entity1)


We use similar approach when writing pony.orm tests. Hope it will work for you.

Regards,
Alexander



On Thu, Dec 11, 2014 at 9:30 PM, Goldberg, Arthur P <arthur.p.goldberg at mssm.edu<mailto:arthur.p.goldberg at mssm.edu>> wrote:
Thanks AK!

but that doesn't quite work.
Here's my basic pattern, reusing general purpose functionality and separating entity declarations from dbms applications.

One module creates the database handle: theDB.py:
from pony.orm import *
db = Database()

Multiple modules define Entitys; they all say:
from pony.orm import *
import theDB
class IDcategory(theDB.db.Entity):
 ...
class ID(theDB.db.Entity):
 ...

One module establishes connections to a database:
geneticsDBMScommon.py:
from pony.orm import *
import theDB

from moduleDefineEntitys1 import *
from moduleDefineEntitys2 import *
...

Many modules (command line programs) that look like:
from geneticsDBMScommon import *
from moduleDefineEntitys1 import *
if __name__ == "__main__":
Connect( dbms, ... )

(I shouldn't say 'import *' so much.)
Overall, calls need to happen in this order:
from pony.orm import *
db = Database()
class IDcategory(theDB.db.Entity): # using the singleton Database handle
 ...
theDB.db.bind( ...)
theDB.db.generate_mapping( )
# optionally drop tables
theDB.db.create_tables()
# use theDB.db

I cannot put
theDB.db = Database()
at the top of Connect() because we get "Mapping is not generated for entity" errors.
But, to disconnect(), everything needs to begin again with db = Database(). So it seems that a single command line program must restart to change the database it is using.

I think that to fix this I need to get rid of theDB.py and have geneticsDBMScommon.py dynamically do:
db = Database()
from moduleDefineEntitys1 import *

...

but I need to work on other things now ...

thanks again

A




On Dec 11, 2014, at 11:13 AM, Alexander Kozlovsky <alexander.kozlovsky at gmail.com<mailto:alexander.kozlovsky at gmail.com>> wrote:
Hi Arthur!

Now I get your problem.

The `disconnect` method does not reverse what `bind` and `generate_mapping` methods do. Once the Database object is binded to specific physical database, it cannot be unbinded. But you can create new database object instead of the previous one. Also, it is possible to have several database objects at once.

To solve your problem, just place the next line at the top of your `Connect` method:

    theDB.db = Database()

This way you will create new db object each time you call `Create` method.

The `disconnect` method is just optimization which allows the program to drop connection to previous database server and to garbage-collect previous db object.

By the way, it is not necessary to have `theDB` class inside of your `theDB` module. In Python, each module is already a Singleton instance.Because of this, you can just place `db = Database()` right into your `theDB` module itself. Then your need to replace `from theDB import *` to `import theDB` in all of your modules, and all should work as before.


Regards,
A.K.

On Thu, Dec 11, 2014 at 5:54 PM, Goldberg, Arthur P <arthur.p.goldberg at mssm.edu<mailto:arthur.p.goldberg at mssm.edu>> wrote:
Hi Alexander

Thanks! Yes, your simple program works.
As far as I know, I'm using 1 thread, and I'd like to switch between different dbmses.
Basically, I'm using
bind()
generate_mapping()
disconnect()
bind()

and getting
TypeError: Database object was already bound to MySQL provider
on the 2nd bind().

Here's a bit of my code.
test program t.py
the connection manager, geneticsDBMScommon.py
a shared singleton database handle, theDB.py
geneticsSubjects and geneticsClasses just define classes.

I can simplify the example if you like.

A



On Dec 10, 2014, at 6:06 PM, Alexander Kozlovsky <alexander.kozlovsky at gmail.com<mailto:alexander.kozlovsky at gmail.com>> wrote:

Hi Arthur!

For what purpose do you want to use `disconnect` method? I'm not sure I correctly understand what example you want to see, but the simplest example of `disconnect` method is this:

    from pony.orm import *

    db = Database('mysql', host="myhost", user="me", passwd="123", db="mydb")

    class Person(db.Entity):
        name = Required(str)

    db.generate_mapping(create_tables=True)

    with db_session:
        p1 = Person(name='John')

    db.disconnect()


The disconnect method works for current thread only. It releases connection to the server which db object holds in its connection pool.

This method should be called outside of any db session.

If you application is multi-threaded and you want to disconnect your db object from the database, the you need to call `disconnect` method from each thread in which you have worked with the entities of this db object.


Regards,
Alexander Kozlovsky


On Wed, Dec 10, 2014 at 5:39 AM, Goldberg, Arthur P <arthur.p.goldberg at mssm.edu<https://urldefense.proofpoint.com/v2/url?u=http-3A__mailto-3Aarthur.p.goldberg-40mssm.edu&d=AAMFaQ&c=4R1YgkJNMyVWjMjneTwN5tJRn8m8VqTSNCjYLg1wNX4&r=TntoeYH7lekXzpBRjXwLTkqiWTbWAvp3pHKo_kZp5qI&m=MdhUTa5GEj8B5HsquznH3IF3hQvAX2z34nrPC35Fbqc&s=ct-V7Z7acRopVeskia8UT4P3-cU9cGjInrFDZss0TLk&e=>> wrote:
Hi Guys

Could you please show an example with disconnect()? I'm using a couple of dbmses in one SQL server, and getting
Database object was already bound to MySQL provider
Sorry, I'm too rushed to debug carefully.

Yhanks
A


---

Arthur Goldberg
Associate Professor of Psychiatry
Seaver Autism Center and Icahn Institute for Genomics & Multiscale Biology
Icahn School of Medicine at Mount Sinai
Seaver Center, Room ABE-33
212-241-4229
Arthur.Goldberg at mssm.edu<https://urldefense.proofpoint.com/v2/url?u=http-3A__mailto-3AArthur.Goldberg-40mssm.edu&d=AAMFaQ&c=4R1YgkJNMyVWjMjneTwN5tJRn8m8VqTSNCjYLg1wNX4&r=TntoeYH7lekXzpBRjXwLTkqiWTbWAvp3pHKo_kZp5qI&m=MdhUTa5GEj8B5HsquznH3IF3hQvAX2z34nrPC35Fbqc&s=zyJFM3R79vy0YD4o6VWXoHEs0OQXaiwdQ3nrXfBIBN8&e=>
Follow us on Twitter @IcahnInstitute<https://urldefense.proofpoint.com/v2/url?u=https-3A__twitter.com_IcahnInstitute&d=AAMFaQ&c=4R1YgkJNMyVWjMjneTwN5tJRn8m8VqTSNCjYLg1wNX4&r=TntoeYH7lekXzpBRjXwLTkqiWTbWAvp3pHKo_kZp5qI&m=MdhUTa5GEj8B5HsquznH3IF3hQvAX2z34nrPC35Fbqc&s=b8XJr7NW4WKs0NkKVXPX5Ua1nTWBMEFE6nwzM3mLer0&e=>





_______________________________________________
ponyorm-list mailing list
ponyorm-list at ponyorm.com<mailto:ponyorm-list at ponyorm.com>
/ponyorm-list<https://urldefense.proofpoint.com/v2/url?u=https-3A__mailman-2Dmail5.webfaction.com_listinfo_ponyorm-2Dlist&d=AAMFaQ&c=4R1YgkJNMyVWjMjneTwN5tJRn8m8VqTSNCjYLg1wNX4&r=TntoeYH7lekXzpBRjXwLTkqiWTbWAvp3pHKo_kZp5qI&m=MdhUTa5GEj8B5HsquznH3IF3hQvAX2z34nrPC35Fbqc&s=EqprhF2xxCO00Y6lH7LjUW0WmnyegTuf-EW5kECRTA8&e=>


_______________________________________________
ponyorm-list mailing list
ponyorm-list at ponyorm.com<mailto:ponyorm-list at ponyorm.com>
https://urldefense.proofpoint.com/v2/url?u=https-3A__mailman-2Dmail5.webfaction.com_listinfo_ponyorm-2Dlist&d=AAIGaQ&c=4R1YgkJNMyVWjMjneTwN5tJRn8m8VqTSNCjYLg1wNX4&r=TntoeYH7lekXzpBRjXwLTkqiWTbWAvp3pHKo_kZp5qI&m=MdhUTa5GEj8B5HsquznH3IF3hQvAX2z34nrPC35Fbqc&s=EqprhF2xxCO00Y6lH7LjUW0WmnyegTuf-EW5kECRTA8&e=

---

Arthur Goldberg
Associate Professor of Psychiatry
Seaver Autism Center and Icahn Institute for Genomics & Multiscale Biology
Icahn School of Medicine at Mount Sinai
Seaver Center, Room ABE-33
212-241-4229
Arthur.Goldberg at mssm.edu<mailto:Arthur.Goldberg at mssm.edu>
Follow us on Twitter @IcahnInstitute<https://urldefense.proofpoint.com/v2/url?u=https-3A__twitter.com_IcahnInstitute&d=AwMFaQ&c=4R1YgkJNMyVWjMjneTwN5tJRn8m8VqTSNCjYLg1wNX4&r=TntoeYH7lekXzpBRjXwLTkqiWTbWAvp3pHKo_kZp5qI&m=YwVTDkQQLeA-rvnWaYkkQ9VzBXh33ZAhgFEk2hOENxI&s=cfiVP61ha8Ag45F8nOyDMtkYYqDZ-Qx_lrVppLFYpCk&e=>





_______________________________________________
ponyorm-list mailing list
ponyorm-list at ponyorm.com<mailto:ponyorm-list at ponyorm.com>
/ponyorm-list<https://urldefense.proofpoint.com/v2/url?u=https-3A__mailman-2Dmail5.webfaction.com_listinfo_ponyorm-2Dlist&d=AwMFaQ&c=4R1YgkJNMyVWjMjneTwN5tJRn8m8VqTSNCjYLg1wNX4&r=TntoeYH7lekXzpBRjXwLTkqiWTbWAvp3pHKo_kZp5qI&m=YwVTDkQQLeA-rvnWaYkkQ9VzBXh33ZAhgFEk2hOENxI&s=IiaXyoraaZ63il62cuaacgi8celdD2x5HB31vFkvHao&e=>

_______________________________________________
ponyorm-list mailing list
ponyorm-list at ponyorm.com<mailto:ponyorm-list at ponyorm.com>
https://urldefense.proofpoint.com/v2/url?u=https-3A__mailman-2Dmail5.webfaction.com_listinfo_ponyorm-2Dlist&d=AwIGaQ&c=4R1YgkJNMyVWjMjneTwN5tJRn8m8VqTSNCjYLg1wNX4&r=TntoeYH7lekXzpBRjXwLTkqiWTbWAvp3pHKo_kZp5qI&m=YwVTDkQQLeA-rvnWaYkkQ9VzBXh33ZAhgFEk2hOENxI&s=IiaXyoraaZ63il62cuaacgi8celdD2x5HB31vFkvHao&e=

---

Arthur Goldberg
Associate Professor of Psychiatry
Seaver Autism Center and Icahn Institute for Genomics & Multiscale Biology
Icahn School of Medicine at Mount Sinai
Seaver Center, Room ABE-33
212-241-4229
Arthur.Goldberg at mssm.edu<mailto:Arthur.Goldberg at mssm.edu>
Follow us on Twitter @IcahnInstitute<https://urldefense.proofpoint.com/v2/url?u=https-3A__twitter.com_IcahnInstitute&d=AwMFaQ&c=4R1YgkJNMyVWjMjneTwN5tJRn8m8VqTSNCjYLg1wNX4&r=TntoeYH7lekXzpBRjXwLTkqiWTbWAvp3pHKo_kZp5qI&m=bfreSqFO30iBjiizihScKUKfcEywktdMXISup54bWC8&s=QWUUnl5VhObHVGrOQwoZC_3P1Lfkj3TA9bW4Q4hLgvE&e=>





_______________________________________________
ponyorm-list mailing list
ponyorm-list at ponyorm.com<mailto:ponyorm-list at ponyorm.com>
/ponyorm-list<https://urldefense.proofpoint.com/v2/url?u=https-3A__mailman-2Dmail5.webfaction.com_listinfo_ponyorm-2Dlist&d=AwMFaQ&c=4R1YgkJNMyVWjMjneTwN5tJRn8m8VqTSNCjYLg1wNX4&r=TntoeYH7lekXzpBRjXwLTkqiWTbWAvp3pHKo_kZp5qI&m=bfreSqFO30iBjiizihScKUKfcEywktdMXISup54bWC8&s=FudRfYgFlnzzsvvftHjQTOdmoIUMf2AoIRWECyPQA4I&e=>

_______________________________________________
ponyorm-list mailing list
ponyorm-list at ponyorm.com<mailto:ponyorm-list at ponyorm.com>
https://urldefense.proofpoint.com/v2/url?u=https-3A__mailman-2Dmail5.webfaction.com_listinfo_ponyorm-2Dlist&d=AwIGaQ&c=4R1YgkJNMyVWjMjneTwN5tJRn8m8VqTSNCjYLg1wNX4&r=TntoeYH7lekXzpBRjXwLTkqiWTbWAvp3pHKo_kZp5qI&m=bfreSqFO30iBjiizihScKUKfcEywktdMXISup54bWC8&s=FudRfYgFlnzzsvvftHjQTOdmoIUMf2AoIRWECyPQA4I&e=

---

Arthur Goldberg
Associate Professor of Psychiatry
Seaver Autism Center and Icahn Institute for Genomics & Multiscale Biology
Icahn School of Medicine at Mount Sinai
Seaver Center, Room ABE-33
212-241-4229
Arthur.Goldberg at mssm.edu<mailto:Arthur.Goldberg at mssm.edu>
Follow us on Twitter @IcahnInstitute<https://twitter.com/IcahnInstitute>




-------------- next part --------------
An HTML attachment was scrubbed...
URL: </ponyorm-list/attachments/20141212/fab027af/attachment-0001.html>


More information about the ponyorm-list mailing list