Hi Horst:
Sadly there have been a lot of changes in pg8000, so it is not backward
compatible with the current custom version in web2py.
First, you need to delete the pg8000 folder in contrib, and put the new
pg8000 folder (the one with __init__.py) directly in the web2py top level
folder (at the same level as gluon).
Note that the new pg8000 uses absolute imports that will not work if pg8000
is in contrib folder (or it should be added to the PYTHONPATH)
Second, you need to apply the attached patch to gluon/dal.py to:
* change the import (and add a missing __version__ attribute)
* change connection to pass individual parameters (dsn string is not
supported anymore)
* change after_connection set_client_encoding to execute SQL
* change server_version to _server_version
I'll propose (again) to the pg8000 group the changes I've introduced for
web2py, so the latest version could be used as a direct drop-in replacement
for psycopg2
IIRC, at some stage the author gave me commit access, but I didn't have
time to pull my changes and missed some discussions about the project
internals.
Best regards
Mariano Reingart
http://www.sistemasagiles.com.ar
http://reingart.blogspot.com
On Tue, Feb 25, 2014 at 5:46 PM, Horst Horst <[email protected]> wrote:
> I've tried the latest pg8000 as a drop-in replacement, but it seems web2py
> can't import it:
>
> <type 'exceptions.RuntimeError'> Failure to connect, tried 5 times:
> Traceback (most recent call last): File
> "/Users/sfx/dev/mdb/web2py.app/Contents/Resources/gluon/dal.py", line 7766,
> in __init__ File
> "/Users/sfx/dev/mdb/web2py.app/Contents/Resources/gluon/dal.py", line 2756,
> in __init__ File
> "/Users/sfx/dev/mdb/web2py.app/Contents/Resources/gluon/dal.py", line 795,
> in find_driver RuntimeError: no driver available ('psycopg2', 'pg8000')
>
> I didn't step through it in the debugger, but the module's __init__.pyc
> got compiled, so I know web2py attempted an import.
>
> The latest pg8000/__init__.py contains a section which matches the former
> interface
>
> # For compatibility with 1.8
> import pg8000 as dbapi
> DBAPI = dbapi
> pg8000_dbapi = DBAPI
>
> so I'd guess it's a minor problem, nonetheless I'm lost at this point.
>
>
> On Monday, February 24, 2014 9:32:05 PM UTC+1, Mariano Reingart wrote:
>
>> You could try to update pg8000 from the official:
>>
>> https://github.com/mfenniak/pg8000
>>
>> Let us know if that works, so we could update the one distributed with
>> web2py
>> The one currently distributed in contrib is an older version with custom
>> patches (as it was not being mantained at the time it was included to
>> web2py), but now the official site has updates that could help you in this
>> case.
>>
>> Best regards
>>
>>
>>
>> Mariano Reingart
>> http://www.sistemasagiles.com.ar
>> http://reingart.blogspot.com
>>
>>
>> On Mon, Feb 24, 2014 at 10:18 AM, Horst Horst <[email protected]> wrote:
>>
>>> I'm getting a:
>>>
>>> <class 'gluon.contrib.pg8000.errors.NotSupportedError'> type oid 114
>>> not mapped to py type
>>>
>>> I'm wondering what's the best thing to do now? Currently I'm considering:
>>>
>>> - using TEXT instead. But my former JSON strings are then enclosed by
>>> "|" which leads to new errors
>>>
>>> - updating gp8000 (there seems to be a newer version, but the version
>>> numbering is confusing)
>>>
>>> - using psycopg2. How can I install this into an Mac OS standalone
>>> version of web2py?
>>>
>>> --
>>> Resources:
>>> - http://web2py.com
>>> - http://web2py.com/book (Documentation)
>>> - http://github.com/web2py/web2py (Source code)
>>> - https://code.google.com/p/web2py/issues/list (Report Issues)
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "web2py-users" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>>
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>
>>
>> --
> Resources:
> - http://web2py.com
> - http://web2py.com/book (Documentation)
> - http://github.com/web2py/web2py (Source code)
> - https://code.google.com/p/web2py/issues/list (Report Issues)
> ---
> You received this message because you are subscribed to the Google Groups
> "web2py-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/groups/opt_out.
>
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.
diff -r d08638fa7fb1 gluon/dal.py
--- a/gluon/dal.py Mon Feb 24 23:57:34 2014 -0600
+++ b/gluon/dal.py Tue Feb 25 23:37:39 2014 -0300
@@ -337,11 +337,14 @@
try:
import gluon.contrib.pg8000.dbapi as pg8000
except ImportError:
- import pg8000.dbapi as pg8000
+ #from pg8000 import dbapi as pg8000
+ import pg8000
+ pg8000.__version__ = "1.9.5"
DRIVERS.append('PostgreSQL(pg8000)')
except ImportError:
LOGGER.debug('no PostgreSQL driver pg8000')
-
+ raise
+
try:
import cx_Oracle
DRIVERS.append('Oracle(cx_Oracle)')
@@ -2865,12 +2868,19 @@
else:
self.__version__ = None
def connector(msg=msg,driver_args=driver_args):
- return self.driver.connect(msg,**driver_args)
+ if self.driver_name == "pg8000":
+ return self.driver.connect(database=db,user=user,host=host,port=int(port),
+ password=password,**driver_args)
+ else:
+ return self.driver.connect(msg,**driver_args)
self.connector = connector
if do_connect: self.reconnect()
def after_connection(self):
- self.connection.set_client_encoding('UTF8')
+ if self.driver_name != "pg8000":
+ self.connection.set_client_encoding('UTF8')
+ else:
+ self.execute("SET client_encoding='UTF8';")
self.execute("SET standard_conforming_strings=on;")
self.try_json()
@@ -2882,7 +2892,7 @@
# check JSON data type support
# (to be added to after_connection)
if self.driver_name == "pg8000":
- supports_json = self.connection.server_version >= "9.2.0"
+ supports_json = self.connection._server_version >= "9.2.0"
elif (self.driver_name == "psycopg2") and \
(self.driver.__version__ >= "2.0.12"):
supports_json = self.connection.server_version >= 90200