[web2py] Re: Error in trunk opening PostgreSQL database
Thanks, it is easy to see how the default parameter gets changed with that example since the binding passes back outside the function through the return value, gets assigned to another variable and then the container contents modified through that assignment.
[web2py] Re: Error in trunk opening PostgreSQL database
Additional information: I added a print to the front end of DAL.__init__ and was surprised to find driver_args was set to {'check_same_thread': False} but I did not set it in my db = DAL() class constructor call. So here is the issue. I start up the development environment on Linux with a terminal command python web2py.py sitting in the correct web2py directory. Because I have Tcl/TK installed on the system it comes up, solicits an admin password and then I start the server. This in turn brings up a browser window running the welcome application. The welcome application as written uses SQLLite as the database and since it is default installed in Python = 2.5 I have the driver and a connection succeeds. The SQLLite adapter does use this driver_args parameter and if it is not set forces it to the value I am seeing. Somehow driver_args gets stored globally and becomes the default for all other adapter calls to __init__ on any other driver as well. To test this theory I commented out the db=DAL(...) line in db.py in the welcome application and restarted the server. This caused the welcome app to crash during the TclTk solicited start of the welcome app when the browser is opened but at least the DAL did not get initialized using the SQLLite database. Now I am able to run my own application and the driver_args = {} which would be correct for the PostgreSQL adapter. Hope that helps isolate it a little better. Ron
[web2py] Re: Error in trunk opening PostgreSQL database
You must be using trunk. I think this is a bug in trunk but not stable. Thanks for reporting it. Massimo On Mar 3, 2:02 pm, ron_m ron.mco...@gmail.com wrote: Additional information: I added a print to the front end of DAL.__init__ and was surprised to find driver_args was set to {'check_same_thread': False} but I did not set it in my db = DAL() class constructor call. So here is the issue. I start up the development environment on Linux with a terminal command python web2py.py sitting in the correct web2py directory. Because I have Tcl/TK installed on the system it comes up, solicits an admin password and then I start the server. This in turn brings up a browser window running the welcome application. The welcome application as written uses SQLLite as the database and since it is default installed in Python = 2.5 I have the driver and a connection succeeds. The SQLLite adapter does use this driver_args parameter and if it is not set forces it to the value I am seeing. Somehow driver_args gets stored globally and becomes the default for all other adapter calls to __init__ on any other driver as well. To test this theory I commented out the db=DAL(...) line in db.py in the welcome application and restarted the server. This caused the welcome app to crash during the TclTk solicited start of the welcome app when the browser is opened but at least the DAL did not get initialized using the SQLLite database. Now I am able to run my own application and the driver_args = {} which would be correct for the PostgreSQL adapter. Hope that helps isolate it a little better. Ron
[web2py] Re: Error in trunk opening PostgreSQL database
I just downloaded the nightly build, unpacked it, copied over my application and get the same problem. I don't have a problem with 1.92.1. I don't normally use trunk but test it once in a while to see what is coming. :-) Ron
[web2py] Re: Error in trunk opening PostgreSQL database
please try change line in dal args = (self,uri,pool_size,folder,db_codec,credential_decoder,driver_args) to args = (self,uri,pool_size,folder,db_codec,credential_decoder,driver_args or {}) On Mar 3, 4:07 pm, ron_m ron.mco...@gmail.com wrote: I just downloaded the nightly build, unpacked it, copied over my application and get the same problem. I don't have a problem with 1.92.1. I don't normally use trunk but test it once in a while to see what is coming. :-) Ron
[web2py] Re: Error in trunk opening PostgreSQL database
Wow that fixed it. You are a Python Ninja :-) I would sure like to know what the mechanism was that caused driver_args to bleed from SQLLite to the other adapters even though it is defaulted it to an empty dict on the class initializer. I also printed driver_args as the first line of code in DAL.__init__() and it had the value left over from SQLLite so how driver_args or {} produces {} when there is a value in driver_args. But you are very busy so if you don't have time no problem.
[web2py] Re: Error in trunk opening PostgreSQL database
class DAL: def __init__(self,...,driver_args={}) so because this is defined in a module, every time driver_args is not passed it is set to {}, the same {}. If one app changes, the default changes for all apps. It is kind of counter intuitive but it works that way. It is very dangerous to set a default in a function to a list of dictionary, because if somewhere downstream the object changed for one instance, it changes the default for all future instances. Massimo On Mar 3, 5:12 pm, ron_m ron.mco...@gmail.com wrote: Wow that fixed it. You are a Python Ninja :-) I would sure like to know what the mechanism was that caused driver_args to bleed from SQLLite to the other adapters even though it is defaulted it to an empty dict on the class initializer. I also printed driver_args as the first line of code in DAL.__init__() and it had the value left over from SQLLite so how driver_args or {} produces {} when there is a value in driver_args. But you are very busy so if you don't have time no problem.
[web2py] Re: Error in trunk opening PostgreSQL database
Ah Ok, I was trying to reproduce with a simple program containing a couple of classes with a main all in one file but it did not exhibit the problem behaviour. So having the classes in a module is part of the recipe and lists and dicts are passed around as object references to the container leaving the contents open to modification.
[web2py] Re: Error in trunk opening PostgreSQL database
def f(a={}): return a ... x=f() x[1]=1 print x {1: 1} y=f() print y {1: 1} On Mar 3, 5:49 pm, ron_m ron.mco...@gmail.com wrote: Ah Ok, I was trying to reproduce with a simple program containing a couple of classes with a main all in one file but it did not exhibit the problem behaviour. So having the classes in a module is part of the recipe and lists and dicts are passed around as object references to the container leaving the contents open to modification.