Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Keeping a database connection with a Singleton?

Reply
Thread Tools

Keeping a database connection with a Singleton?

 
 
exhuma.twn
Guest
Posts: n/a
 
      09-19-2007
I remember reading about the Singleton pattern in python and how it's
an unpythonic pattern and all. At the time I did not need the
Singleton anyways, so I just glanced over the document.

But, setting this aside: I have an application where I have a
connection to a database. At some point in the application I open up a
new window. The new windows resides in a different module. So I have a
directory structure like this:

- mainapp.py
- newwindow.py

So I import "newwindow" in "mainapp" so I can instantiate and display
it. Meanwhile, the main-app has an open connection to the database.
What's the cleanest way to hand this connection to the new window? I
can see several possibilities:

1) Simply pass the connection as paramtere to the constructor of new-
window.
2) Use the "Singleton" deisign pattern to keep a reference to the
connection
3) Open up a completely new connection to the database in the new
window.

Now, option 1) is clearly the easiest to implement, however, I somehow
tend to use option 2 (the singleton) as it's more flexible. Option 3
looks ugly to me.

This is a stuation I run into many times. And I am always faced with
the same choice. And I never know which one to chose. And now that I
am getting more and more comfortable with the basics of python, I
would like to know if I am missing something more "pythonic".

So, what would you recommend?

 
Reply With Quote
 
 
 
 
Jason
Guest
Posts: n/a
 
      09-19-2007
On Sep 19, 7:26 am, "exhuma.twn" <exh...@gmail.com> wrote:
> I remember reading about the Singleton pattern in python and how it's
> an unpythonic pattern and all. At the time I did not need the
> Singleton anyways, so I just glanced over the document.
>
> But, setting this aside: I have an application where I have a
> connection to a database. At some point in the application I open up a
> new window. The new windows resides in a different module. So I have a
> directory structure like this:
>
> - mainapp.py
> - newwindow.py
>
> So I import "newwindow" in "mainapp" so I can instantiate and display
> it. Meanwhile, the main-app has an open connection to the database.
> What's the cleanest way to hand this connection to the new window? I
> can see several possibilities:
>
> 1) Simply pass the connection as paramtere to the constructor of new-
> window.
> 2) Use the "Singleton" deisign pattern to keep a reference to the
> connection
> 3) Open up a completely new connection to the database in the new
> window.
>
> Now, option 1) is clearly the easiest to implement, however, I somehow
> tend to use option 2 (the singleton) as it's more flexible. Option 3
> looks ugly to me.
>
> This is a stuation I run into many times. And I am always faced with
> the same choice. And I never know which one to chose. And now that I
> am getting more and more comfortable with the basics of python, I
> would like to know if I am missing something more "pythonic".
>
> So, what would you recommend?


You don't need a way to make every instance the same. You need a way
where every instance shares the same state. Aka, the Borg pattern,
courtesy of Alex Martelli. It's in the Python Cookbook at "http://
aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66531". Good luck!

--Jason

 
Reply With Quote
 
 
 
 
Peter Otten
Guest
Posts: n/a
 
      09-19-2007
exhuma.twn wrote:

> I remember reading about the Singleton pattern in python and how it's
> an unpythonic pattern and all. At the time I did not need the
> Singleton anyways, so I just glanced over the document.
>
> But, setting this aside: I have an application where I have a
> connection to a database. At some point in the application I open up a
> new window. The new windows resides in a different module. So I have a
> directory structure like this:
>
> - mainapp.py
> - newwindow.py
>
> So I import "newwindow" in "mainapp" so I can instantiate and display
> it. Meanwhile, the main-app has an open connection to the database.
> What's the cleanest way to hand this connection to the new window? I
> can see several possibilities:
>
> 1) Simply pass the connection as paramtere to the constructor of new-
> window.
> 2) Use the "Singleton" deisign pattern to keep a reference to the
> connection
> 3) Open up a completely new connection to the database in the new
> window.
>
> Now, option 1) is clearly the easiest to implement, however, I somehow
> tend to use option 2 (the singleton) as it's more flexible. Option 3
> looks ugly to me.
>
> This is a stuation I run into many times. And I am always faced with
> the same choice. And I never know which one to chose. And now that I
> am getting more and more comfortable with the basics of python, I
> would like to know if I am missing something more "pythonic".
>
> So, what would you recommend?


Passing the connection as a parameter is the best approach because it
keeps the dependencies explicit. Also, it allows you to switch between
singleton and one connection per window without ever touching the newwindow
module.

By the way, there is a pythonic (near) singleton: the module. So if you go
with option 2, just move the connection setup into a separate module that
you can import into client code.

Peter
 
Reply With Quote
 
exhuma.twn
Guest
Posts: n/a
 
      09-19-2007
On Sep 19, 3:45 pm, Peter Otten <__pete...@web.de> wrote:
> exhuma.twn wrote:

[...]
>
> By the way, there is a pythonic (near) singleton: the module. So if you go
> with option 2, just move the connection setup into a separate module that
> you can import into client code.
>
> Peter


You say "(near)" singleton. What's the difference then?


 
Reply With Quote
 
Peter Otten
Guest
Posts: n/a
 
      09-19-2007
exhuma.twn wrote:

> On Sep 19, 3:45 pm, Peter Otten <__pete...@web.de> wrote:
>> exhuma.twn wrote:

> [...]
>>
>> By the way, there is a pythonic (near) singleton: the module. So if you go
>> with option 2, just move the connection setup into a separate module that
>> you can import into client code.
>>
>> Peter

>
> You say "(near)" singleton. What's the difference then?


I was thinking of the main script of an application. If you import
that by its name

import main # assuming the file is main.py

you end up with two instances sys.modules["main"] and sys.modules["__main__"].

Peter
 
Reply With Quote
 
exhuma.twn
Guest
Posts: n/a
 
      09-19-2007
On Sep 19, 4:03 pm, Peter Otten <__pete...@web.de> wrote:
> exhuma.twn wrote:
> > On Sep 19, 3:45 pm, Peter Otten <__pete...@web.de> wrote:
> >> exhuma.twn wrote:

> > [...]

>
> >> By the way, there is a pythonic (near) singleton: the module. So if you go
> >> with option 2, just move the connection setup into a separate module that
> >> you can import into client code.

>
> >> Peter

>
> > You say "(near)" singleton. What's the difference then?

>
> I was thinking of the main script of an application. If you import
> that by its name
>
> import main # assuming the file is main.py
>
> you end up with two instances sys.modules["main"] and sys.modules["__main__"].
>
> Peter


I see. Thanks. I will give it a go.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Database Database Database Database scott93727@gmail.com Computer Information 0 09-27-2012 02:43 AM
DataBase DataBase DataBase DataBase scott93727@gmail.com Computer Information 0 09-26-2012 09:40 AM
are there pros or contras, keeping a connection to a (sqlite) database? Stef Mientki Python 4 09-09-2010 06:29 PM
q; Keeping Credit Card in the database =?Utf-8?B?SklNLkgu?= ASP .Net 4 07-11-2007 07:49 PM
Serious problems keeping an hold on database support in ASP.NET 2 Edwin Knoppert ASP .Net 5 11-21-2005 11:42 PM



Advertisments