Package: pypq
What is pypqpypqis aDBAPI 2.0compliant Python driver forPostgreSQL,
made usingctypesandlibpq.solibrary.This means, that it can be used withPyPy, or any other circumstances,
where ctypes is available, butpsycopg2, the most popular PostgreSQL
driver, is not.Featuresfull DBAPI 2.0 compliancefast enough to be compared to psycopg2a psycopg2-like extension APIhas a Django backendcasting of all standard python types implemented, including
datetime, date and timedelta, except converting lists into postgres
arrays and vice versaInstallationJust do:easy_install pypqOr to download the most recent version from BitBucket:hg clone ssh://hg@bitbucket.org/descent/pypq
cd pypyq
python setup.py installExample usageBasic operations:import pypq
connection = pypq.connect('dbname=dbname user=user host=host port=port password=password')
# or
connection = pypq.connect(dbname='dbname', user='user', host='host', \
    port='port', password='password')
# for complete reference look at PQconnectdbParams section at
# http://www.postgresql.org/docs/9.1/static/libpq-connect.htm
cursor = connection.cursor()
cursor.execute('select * from mytable where x = %s', [x])
for row in cursor:
    print rowTo use pypq as a django backend, simply change the ‘ENGINE’ line to“pypq.django_backend”insettings.pyfile. Something like:DATABASES = {
    'default': {
        'ENGINE': 'pypq.django_backend',
        'NAME': 'dbname',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'host',
        'PORT': '',
    }
}

# If using south, change the database adapter

SOUTH_DATABASE_ADAPTERS = {'default': 'pypq.django_backend.south_adapter'}Extending with custom types is done in simimlar way topsycopg2. Here
are some examples, but you can look atpypq/datatypes.pyfor
additional ways of usage:def adapter(myclass_instance):
    """A function to adapt MyClass to postgres

    It should return a string and a postgres OID of
    resulting datatype or 0 if you do not know it
     (it's ok to do that)
    """
    return adapted, oid

# This will allow doing this:
# cursor.execute('select %s', [myclass_instance])
pypq.datatypes.register_adapter(MyClass, adapter)

# And this will allow doing this, if you have a special type
# in postgres which you want to handle manually, and for
# which you know postgres OIDs:

# cursor.execute('create table test(a some_special_type)')
# cursor.execute('select * from test')
# and it will fetch your launch to_python(value)
# for every special instance

def to_python(value):
    """A function to convert a postgres value into Python object""""

mytype = pypq.datatypes.new_type((1,2,3), 'MyAwesomeType', to_python))
pypq.datatypes.register_type(mytype)

# or

class MyType(pypq.datatypes.PyPQDataType):

    oids = (1,2,3)

    @classmethod
    def to_python(cls, value):
        return valueBugsThe project currently has some limitations
- no support of postgres arrays yet
- this does not work somewhy, though it works in psycopg2:cur.execute('select %s', [None])
DatabaseError: ERROR: could not determine data type of parameter $1Internally, OID’s are currently not passed to the database, when
executing PQexecParams. I am not sure, if it is ok, but django works
flawleslly this way, and if we pass the OID’s to PQexecParams, it
does not, cause some postgres type casting fails.not tested on other python versions than 2.7 and recent pypynot tested on windows (it probably won’t work)not thread-safe, you cannot use same cursors or connections in
different threads