summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/dialects/postgresql
diff options
context:
space:
mode:
authorShaun Stanworth <shaun.stanworth@onefinestay.com>2014-11-09 14:52:31 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2015-01-26 18:43:19 -0500
commitf94d75ede5f5d2ed28d72ff98ca7caca016e5506 (patch)
treecb10a74016216a849423d0878219d15e5bc3b371 /lib/sqlalchemy/dialects/postgresql
parent987f40b5aa325fe8a6655bcb0be2329c0a24025d (diff)
downloadsqlalchemy-f94d75ede5f5d2ed28d72ff98ca7caca016e5506.tar.gz
Added psycopg2cffi dialect
Diffstat (limited to 'lib/sqlalchemy/dialects/postgresql')
-rw-r--r--lib/sqlalchemy/dialects/postgresql/__init__.py2
-rw-r--r--lib/sqlalchemy/dialects/postgresql/psycopg2.py17
-rw-r--r--lib/sqlalchemy/dialects/postgresql/psycopg2cffi.py46
3 files changed, 61 insertions, 4 deletions
diff --git a/lib/sqlalchemy/dialects/postgresql/__init__.py b/lib/sqlalchemy/dialects/postgresql/__init__.py
index 1cff8e3a0..01a846314 100644
--- a/lib/sqlalchemy/dialects/postgresql/__init__.py
+++ b/lib/sqlalchemy/dialects/postgresql/__init__.py
@@ -5,7 +5,7 @@
# This module is part of SQLAlchemy and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
-from . import base, psycopg2, pg8000, pypostgresql, zxjdbc
+from . import base, psycopg2, pg8000, pypostgresql, zxjdbc, psycopg2cffi
base.dialect = psycopg2.dialect
diff --git a/lib/sqlalchemy/dialects/postgresql/psycopg2.py b/lib/sqlalchemy/dialects/postgresql/psycopg2.py
index fe27da8b6..5246abf1c 100644
--- a/lib/sqlalchemy/dialects/postgresql/psycopg2.py
+++ b/lib/sqlalchemy/dialects/postgresql/psycopg2.py
@@ -512,9 +512,19 @@ class PGDialect_psycopg2(PGDialect):
import psycopg2
return psycopg2
+ @classmethod
+ def _psycopg2_extensions(cls):
+ from psycopg2 import extensions
+ return extensions
+
+ @classmethod
+ def _psycopg2_extras(cls):
+ from psycopg2 import extras
+ return extras
+
@util.memoized_property
def _isolation_lookup(self):
- from psycopg2 import extensions
+ extensions = self._psycopg2_extensions()
return {
'AUTOCOMMIT': extensions.ISOLATION_LEVEL_AUTOCOMMIT,
'READ COMMITTED': extensions.ISOLATION_LEVEL_READ_COMMITTED,
@@ -536,7 +546,8 @@ class PGDialect_psycopg2(PGDialect):
connection.set_isolation_level(level)
def on_connect(self):
- from psycopg2 import extras, extensions
+ extras = self._psycopg2_extras()
+ extensions = self._psycopg2_extensions()
fns = []
if self.client_encoding is not None:
@@ -586,7 +597,7 @@ class PGDialect_psycopg2(PGDialect):
@util.memoized_instancemethod
def _hstore_oids(self, conn):
if self.psycopg2_version >= (2, 4):
- from psycopg2 import extras
+ extras = self._psycopg2_extras()
oids = extras.HstoreAdapter.get_oids(conn)
if oids is not None and oids[0]:
return oids[0:2]
diff --git a/lib/sqlalchemy/dialects/postgresql/psycopg2cffi.py b/lib/sqlalchemy/dialects/postgresql/psycopg2cffi.py
new file mode 100644
index 000000000..5217c5561
--- /dev/null
+++ b/lib/sqlalchemy/dialects/postgresql/psycopg2cffi.py
@@ -0,0 +1,46 @@
+# testing/engines.py
+# Copyright (C) 2005-2014 the SQLAlchemy authors and contributors
+# <see AUTHORS file>
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+"""
+.. dialect:: postgresql+psycopg2cffi
+ :name: psycopg2cffi
+ :dbapi: psycopg2cffi
+ :connectstring: \
+postgresql+psycopg2cffi://user:password@host:port/dbname\
+[?key=value&key=value...]
+ :url: http://pypi.python.org/pypi/psycopg2cffi/
+
+`psycopg2cffi` is an adaptation of `psycopg2`, using CFFI for the C
+layer. This makes it suitable for use in e.g. PyPy. Documentation
+is as per `psycopg2`.
+
+.. seealso::
+
+ :mod:`sqlalchemy.dialects.postgresql.psycopg2`
+
+"""
+from .psycopg2 import PGDialect_psycopg2
+
+
+class PGDialect_psycopg2cffi(PGDialect_psycopg2):
+ driver = 'psycopg2cffi'
+
+ @classmethod
+ def dbapi(cls):
+ return __import__('psycopg2cffi')
+
+ @classmethod
+ def _psycopg2_extensions(cls):
+ root = __import__('psycopg2cffi', fromlist=['extensions'])
+ return root.extensions
+
+ @classmethod
+ def _psycopg2_extras(cls):
+ root = __import__('psycopg2cffi', fromlist=['extras'])
+ return root.extras
+
+
+dialect = PGDialect_psycopg2cffi