baztian / jaydebeapi

JayDeBeApi module allows you to connect from Python code to databases using Java JDBC. It provides a Python DB-API v2.0 to that database.
GNU Lesser General Public License v3.0
365 stars 148 forks source link
database db java jdbc python python-2-7 python-3 sql

================================================================= JayDeBeApi - bridge from JDBC database drivers to Python DB-API

.. image:: https://github.com/baztian/jaydebeapi/workflows/tests/badge.svg :target: https://github.com/baztian/jaydebeapi/actions?query=workflow%3Atests :alt: test status

.. image:: https://img.shields.io/coveralls/baztian/jaydebeapi/master.svg :target: https://coveralls.io/r/baztian/jaydebeapi

.. image:: https://img.shields.io/badge/python-2.7,_3.5,_3.6,_3.8-blue.svg :target: https://pypi.python.org/pypi/JayDeBeApi/

.. image:: https://img.shields.io/badge/jython-2.7.2-blue.svg :target: https://pypi.python.org/pypi/JayDeBeApi/

.. image:: https://img.shields.io/github/tag/baztian/jaydebeapi.svg :target: https://pypi.python.org/pypi/JayDeBeApi/

.. image:: https://img.shields.io/pypi/dm/JayDeBeApi.svg :target: https://pypi.python.org/pypi/JayDeBeApi/

The JayDeBeApi module allows you to connect from Python code to databases using Java JDBC <http://java.sun.com/products/jdbc/overview.html>. It provides a Python DB-API v2.0 to that database.

It works on ordinary Python (cPython) using the JPype Java integration or on Jython <http://www.jython.org/> to make use of the Java JDBC driver.

In contrast to zxJDBC from the Jython project JayDeBeApi let's you access a database with Jython AND Python with only minor code modifications. JayDeBeApi's future goal is to provide a unique and fast interface to different types of JDBC-Drivers through a flexible plug-in mechanism.

.. contents::

Install

You can get and install JayDeBeApi with pip <http://pip.pypa.io/>_ ::

$ pip install JayDeBeApi

If you want to install JayDeBeApi in Jython make sure to have pip or EasyInstall available for it.

Or you can get a copy of the source by cloning from the JayDeBeApi github project <https://github.com/baztian/jaydebeapi>_ and install with ::

$ python setup.py install

or if you are using Jython use ::

$ jython setup.py install

It has been tested with Jython 2.7.2.

If you are using cPython ensure that you have installed JPype_ properly. It has been tested with JPype1 0.6.3 and 0.7.5 for Python 3 and with JPype1 0.6.3 and 0.7.0 for Python 2.7. Older JPype installations may cause problems.

Usage

Basically you just import the jaydebeapi Python module and execute the connect method. This gives you a DB-API_ conform connection to the database.

The first argument to connect is the name of the Java driver class. The second argument is a string with the JDBC connection URL. Third you can optionally supply a sequence consisting of user and password or alternatively a dictionary containing arguments that are internally passed as properties to the Java DriverManager.getConnection method. See the Javadoc of DriverManager class for details.

The next parameter to connect is optional as well and specifies the jar-Files of the driver if your classpath isn't set up sufficiently yet. The classpath set in CLASSPATH environment variable will be honored. See the documentation of your Java runtime environment.

Here is an example:

import jaydebeapi conn = jaydebeapi.connect("org.hsqldb.jdbcDriver", ... "jdbc:hsqldb:mem:.", ... ["SA", ""], ... "/path/to/hsqldb.jar",) curs = conn.cursor() curs.execute('create table CUSTOMER' ... '("CUST_ID" INTEGER not null,' ... ' "NAME" VARCHAR(50) not null,' ... ' primary key ("CUST_ID"))' ... ) curs.execute("insert into CUSTOMER values (?, ?)", (1, 'John')) curs.execute("select * from CUSTOMER") curs.fetchall() [(1, u'John')] curs.close() conn.close()

If you're having trouble getting this work check if your JAVA_HOME environment variable is set correctly. For example I have to set it on my Ubuntu machine like this ::

$ JAVA_HOME=/usr/lib/jvm/java-8-openjdk python

An alternative way to establish connection using connection properties:

conn = jaydebeapi.connect("org.hsqldb.jdbcDriver", ... "jdbc:hsqldb:mem:.", ... {'user': "SA", 'password': "", ... 'other_property': "foobar"}, ... "/path/to/hsqldb.jar",)

Also using the with statement might be handy:

with jaydebeapi.connect("org.hsqldb.jdbcDriver", ... "jdbc:hsqldb:mem:.", ... ["SA", ""], ... "/path/to/hsqldb.jar",) as conn: ... with conn.cursor() as curs: ... curs.execute("select count(*) from CUSTOMER") ... curs.fetchall() [(1,)]

Supported databases

In theory every database with a suitable JDBC driver should work. It is confirmed to work with the following databases:

Contributing

Please submit bugs and patches <https://github.com/baztian/jaydebeapi/issues>_. All contributors will be acknowledged. Thanks!

License

JayDeBeApi is released under the GNU Lesser General Public license (LGPL). See the file COPYING and COPYING.LESSER in the distribution for details.

Changelog

To do

.. _DB-API: http://www.python.org/dev/peps/pep-0249/ .. _JPype: https://pypi.python.org/pypi/JPype1/