{ "info": { "author": "Alexander Lokhman", "author_email": "alex.lokhman@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "pyDBAL\n======\n\nDatabase Abstraction Layer (**DBAL**) for Python 2.6+.\n\npyDBAL library is the improved and optimised port of `Doctrine\nDBAL `__ project.\n\nInstallation\n------------\n\n.. code-block:: bash\n\n $ pip install pydbal\n\nRequirements\n------------\n\nFor using ``mysql`` driver ``MySQLdb`` library is required. Optionally\n``lrucache`` is required to maintain memory safe cache operations.\n\nBasic Usage\n-----------\n\nTo open new connection import ``Connection`` from ``pydbal.connection``\npackage and initialise ``Connection`` class for a required driver with\ndesired parameters.\n\n.. code-block:: python\n\n from pydbal.connection import Connection\n\n conn = Connection('mysql', host='localhost', user='root', database='mydb')\n\npyDBAL currently supports the following drivers: ``mysql`` and\n``sqlite``. You can create a custom driver by inheriting\n``pydbal.drivers.BaseDriver`` and passing to ``Connection`` constructor.\n\nQuery Statements\n~~~~~~~~~~~~~~~~\n\nTo **SELECT** data from the database you may use ``query`` method. This\nmethod will return the instance of ``pydbal.statement.Statement``.\n\n.. code-block:: python\n\n # simple fetch generator\n for row in conn.query('SELECT * FROM table'):\n print(row)\n\n # same as the above but fetch mode can be applied (Connection.FETCH_*)\n for row in conn.query('SELECT * FROM table').iterate(fetch_mode=Connection.FETCH_OBJECT):\n print(row)\n\n # fetch row by row\n result = conn.query('SELECT * FROM table')\n row1 = result.fetch()\n row2 = result.fetch()\n\n # fetch all rows\n rows = conn.query('SELECT * FROM table').fetch_all()\n\n # fetch single value from column\n count = conn.query('SELECT COUNT(*) FROM table').fetch_column()\n\n # fetch all values from column by index\n ids = conn.query('SELECT id FROM table').fetch_all(fetch_mode=Connection.FETCH_COLUMN, column_index=0)\n\nExecute Statements\n~~~~~~~~~~~~~~~~~~\n\nTo execute **INSERT**, **UPDATE** or **DELETE** statements you may use\n``execute`` method. This method will return number of affected rows.\n\n.. code-block:: python\n\n # INSERT\n conn.execute('INSERT INTO table VALUES (?)', [val1, val2, val3])\n last_insert_id = conn.last_insert_id()\n\n # UPDATE\n affected_rows = conn.execute('UPDATE table SET column = ? WHERE id = ?', val1, id_)\n\n # DELETE\n affected_rows = conn.execute('DELETE FROM table WHERE id = ?', id_)\n\nStatement Parameters\n~~~~~~~~~~~~~~~~~~~~\n\nBoth ``query`` and ``execute`` methods support safe parameter binding by\npassing arguments after the first ``sql`` argument.\n\n.. code-block:: python\n\n # single positional parameter\n row = conn.query('SELECT * FROM table WHERE id = ?', id_).fetch()\n\n # multiple positional parameters\n row = conn.query('SELECT * FROM table WHERE id = ? OR id = ?', id1, id2).fetch()\n\n # named parameters\n row = conn.query('SELECT * FROM table WHERE id = :id1 OR id = :id2', id1=id1, id2=id2).fetch()\n\n # iterable parameters\n row = conn.query('SELECT * FROM table WHERE id IN (?)', [id1, id2]).fetch()\n\nTransactions\n~~~~~~~~~~~~\n\npyDBAL supports transactional operations.\n\n.. code-block:: python\n\n conn.begin_transaction()\n try:\n # ... execute statements ...\n conn.commit()\n return smth\n except:\n conn.rollback()\n raise\n\n # same as the above\n def trans(conn):\n # ... execute statements ...\n return smth\n smth = conn.transaction(trans)\n\nIf database platform supports *savepoints* you may enable and use nested\ntransactions.\n\n.. code-block:: python\n\n conn.set_nest_transactions_with_savepoints(True)\n conn.begin_transaction()\n # ... execute statements 1 ...\n conn.begin_transaction()\n # ... execute statements 2 ...\n conn.commit() # commit 1\n conn.rollback() # rollback 2\n\n # to control savepoints manually\n conn.create_savepoint('MYSAVEPOINT')\n conn.release_savepoint('MYSAVEPOINT')\n conn.rollback_savepoint('MYSAVEPOINT')\n\nSQL Builder\n~~~~~~~~~~~\n\nTo make writing SQL statements more simple and flexible it's suggested\nto use ``pydbal.builder.SQLBuilder``.\n\n.. code-block:: python\n\n # SELECT\n sqb = (\n conn.sql_builder()\n .select('t1.id', 't2.id', 'SUM(t1.col) AS special')\n .from_('table1', 't1')\n .join('t1', 'table2', 't2', 't2.id = t1.id')\n .where('t1.col = :val')\n .set_parameter('val', val)\n .group_by('t1.col')\n .having('special IS NOT NULL')\n .order_by('t2.id')\n )\n for row in sqb.execute():\n print(row)\n\n # INSERT\n last_insert_id = (\n conn.sql_builder()\n .insert('table')\n .values({'col1': val1, 'col2': val2})\n ).execute()\n\n # UPDATE\n affected_rows = (\n conn.sql_builder()\n .update('table')\n .set('col1', val1)\n .set('col2', val2)\n .where('id = :id')\n .set_parameter('id', id_)\n ).execute()\n\n # DELETE\n affected_rows = (\n conn.sql_builder()\n .delete('table')\n .where('id = ?')\n .set_parameter(0, id_)\n ).execute()\n\nExpression Builder\n~~~~~~~~~~~~~~~~~~\n\n``WHERE``, ``HAVING`` and ``JOIN ... ON`` expressions can be created\nusing ``pydbal.builder.ExpressionBuilder``.\n\n.. code-block:: python\n\n expr = conn.get_expression_builder()\n # or via SQL Builder instance\n # expr = sqb.expr()\n\n sqb.where(\n expr.and_x(expr.eq('a', 'b'), expr.is_null('c'))\n .or_x(\n expr.and_x('d IS NULL', expr.in_('e', ['1', '2', '3'])),\n expr.neq('f', expr.literal('abc'))\n )\n )\n\nSchema Manager\n~~~~~~~~~~~~~~\n\npyDBAL comes with simple read only SQL schema manager. It supports\nlisting of databases, tables, views, columns, indexes and foreign keys.\nInternal database queries are cached with ``pydbal.cache`` mechanisms.\n\n.. code-block:: python\n\n sm = conn.get_schema_manager()\n\n # database names\n db_names = sm.get_database_names()\n\n # views\n views = sm.get_views()\n view_names = sm.get_view_names()\n\n # tables\n tables = sm.get_tables()\n table_names = sm.get_table_names()\n\n # columns\n table_columns = sm.get_table_columns('table')\n table_column_names = sm.get_table_column_names('table')\n\n # indexes\n table_indexes = sm.get_table_indexes('table')\n table_index_names = sm.get_table_index_names('table')\n\n # foreign keys\n table_foreign_keys = sm.get_table_foreign_keys('table')\n table_foreign_key_names = sm.get_table_foreign_key_names('table')\n\n\nThread-safe Connection\n~~~~~~~~~~~~~~~~~~~~~~\n\npyDBAL v0.10+ supports thread-safe connection functionality implemented in\n``pydbal.threading`` module.\n\n.. code-block:: python\n\n from pydbal.threading import SafeConnection\n\n conn = SafeConnection('mysql', host='localhost', user='root', database='mydb')\n\n``SafeConnection`` wrapper class maintains active connections in locked pool\nand provides helper methods for manipulating your data. Class implements method\n``locked()`` which should be passed to ``with`` statement. It generates\nisolated connection context, that can be used for sending non-trivial commands\nto the original ``pydbal.connection.Connection`` object.\n\n.. code-block:: python\n\n # simple fetch generator\n for row in conn.query('SELECT * FROM table'):\n print(row)\n\n # fetch one row\n row = conn.fetch('SELECT * FROM table WHERE id = ?', id_)\n\n # fetch all rows\n rows = conn.fetch_all('SELECT * FROM table')\n\n # fetch single value from column\n count = conn.fetch_column('SELECT COUNT(*) FROM table')\n\n # UPDATE or DELETE queries\n affected_rows = conn.execute('UPDATE table SET column = ? WHERE id = ?', val1, id_)\n\n # INSERT query with last inserted ID\n with conn.locked() as _conn:\n _conn.execute('INSERT INTO table VALUES (?)', [val1, val2, val3])\n last_insert_id = _conn.last_insert_id()\n\n # transaction callback\n def trans(_conn):\n # ... execute statements ...\n return smth\n smth = conn.transaction(trans)\n\n\nLicense\n-------\n\nLibrary is available under the MIT license. The included LICENSE file\ndescribes this in detail.", "description_content_type": null, "docs_url": null, "download_url": "https://github.com/lokhman/pydbal/tarball/0.12", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/lokhman/pydbal", "keywords": "database,abstraction,sql,mysql,sqlite", "license": "https://opensource.org/licenses/MIT", "maintainer": null, "maintainer_email": null, "name": "pydbal", "package_url": "https://pypi.org/project/pydbal/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/pydbal/", "project_urls": { "Download": "https://github.com/lokhman/pydbal/tarball/0.12", "Homepage": "https://github.com/lokhman/pydbal" }, "release_url": "https://pypi.org/project/pydbal/0.12/", "requires_dist": null, "requires_python": null, "summary": "Database Abstraction Layer (DBAL) for Python 2.6+", "version": "0.12" }, "last_serial": 2185595, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "50c7852105bf5c2c0c97455a8974a55b", "sha256": "76298eefa69fa8b44f3892912f028700e632cf9c0f7773ebb72c48bfd609adb3" }, "downloads": -1, "filename": "pydbal-0.1.tar.gz", "has_sig": false, "md5_digest": "50c7852105bf5c2c0c97455a8974a55b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12027, "upload_time": "2016-04-06T14:21:45", "url": "https://files.pythonhosted.org/packages/46/31/9ee3b85710fea7527a65b47c1a697a39b5a7d342ae7fa78976e84a6fafe5/pydbal-0.1.tar.gz" } ], "0.10": [ { "comment_text": "", "digests": { "md5": "e36ad9d127f53781ca9b75ecf892f24d", "sha256": "24dcb3a4fb7221e8d502a69b6eb4e13ea2ae7e668b1df0e5a5b1dc4eefd07455" }, "downloads": -1, "filename": "pydbal-0.10.tar.gz", "has_sig": false, "md5_digest": "e36ad9d127f53781ca9b75ecf892f24d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28230, "upload_time": "2016-06-10T12:40:50", "url": "https://files.pythonhosted.org/packages/f0/cb/16183f7f0dca8bf05af6474ff0d4f48d14f09c53f5aadd8299eccad216aa/pydbal-0.10.tar.gz" } ], "0.11": [ { "comment_text": "", "digests": { "md5": "4438dc4d8ee5cf1bc25be1e6abc1793e", "sha256": "57c8f2ce8b4d114a64c729652fc0071873f54fcc1f2e10e942dc4c62ba57319e" }, "downloads": -1, "filename": "pydbal-0.11.tar.gz", "has_sig": false, "md5_digest": "4438dc4d8ee5cf1bc25be1e6abc1793e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28240, "upload_time": "2016-06-10T16:37:43", "url": "https://files.pythonhosted.org/packages/35/98/1002ed2c667a49fd7ed5781a1fbb0a690a3d6cb89b13829550f78494297a/pydbal-0.11.tar.gz" } ], "0.12": [ { "comment_text": "", "digests": { "md5": "3e546be78cfa02d04787d295d52af416", "sha256": "1e89e9e87dc170f6fd487cbc93d9d5e8c86b810efdd5981a905c065ddf00c54c" }, "downloads": -1, "filename": "pydbal-0.12.tar.gz", "has_sig": false, "md5_digest": "3e546be78cfa02d04787d295d52af416", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28247, "upload_time": "2016-06-24T16:24:06", "url": "https://files.pythonhosted.org/packages/45/62/6b00e5f477690e260853e6f7ef71987791668ca58501314fb0162d2754d8/pydbal-0.12.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "e77716f1d38795e29f2ed99edee297bf", "sha256": "e6e7b0bc312fb58eb8820a3343e54abe610bfe990452e208b8d9631f6c5a029d" }, "downloads": -1, "filename": "pydbal-0.2.tar.gz", "has_sig": false, "md5_digest": "e77716f1d38795e29f2ed99edee297bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13127, "upload_time": "2016-04-14T13:30:32", "url": "https://files.pythonhosted.org/packages/22/c6/2a714e6c6a2b567b0ccdc5d879a210810659f9c7a25db7d2bbdcad318128/pydbal-0.2.tar.gz" } ], "0.3": [], "0.4": [ { "comment_text": "", "digests": { "md5": "f1e7d5eb09e35cfa41aa4701272d1553", "sha256": "04830e96ebb847b697c79e33904736c8f9f7a38254bbeee8840a72c7c633c265" }, "downloads": -1, "filename": "pydbal-0.4.tar.gz", "has_sig": false, "md5_digest": "f1e7d5eb09e35cfa41aa4701272d1553", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18758, "upload_time": "2016-04-25T15:22:26", "url": "https://files.pythonhosted.org/packages/80/8b/7860c080e49b9077b1028c6316ee809dfca86c4db59e56e2e55c0a532641/pydbal-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "047e7e0ccb4f8181ee9bbd8a0e623311", "sha256": "c41eb543d941cd6a4f09cd662181538a84ee30270c8bed737e9f3149f6552d06" }, "downloads": -1, "filename": "pydbal-0.5.tar.gz", "has_sig": false, "md5_digest": "047e7e0ccb4f8181ee9bbd8a0e623311", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18757, "upload_time": "2016-04-28T09:46:53", "url": "https://files.pythonhosted.org/packages/45/ba/0d57dbfb8cc0c6e4a5e000cf9cefa52af92cc1ce3aaca56d913df6a73d00/pydbal-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "775542b61a2a93b016b3655c9a6f2b46", "sha256": "caaefc17b6c892e904e67b75534786b3a8be8dbc495274c1c81fcddd3276dea4" }, "downloads": -1, "filename": "pydbal-0.6.tar.gz", "has_sig": false, "md5_digest": "775542b61a2a93b016b3655c9a6f2b46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26330, "upload_time": "2016-04-28T10:01:06", "url": "https://files.pythonhosted.org/packages/a2/69/f04657266d2bd24cc7df442d58d3b40b030846f8b80d7ce736ab3a7b010e/pydbal-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "8c60d9a36141bdc7549131b3291069e7", "sha256": "6b567c4620d73cd5c14e36f316d87ee1b1019a34bb9dd175edf02450877e9dd7" }, "downloads": -1, "filename": "pydbal-0.7.tar.gz", "has_sig": false, "md5_digest": "8c60d9a36141bdc7549131b3291069e7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26550, "upload_time": "2016-04-28T14:16:53", "url": "https://files.pythonhosted.org/packages/ad/70/324bf50a088c9ba0bdd2c9623f526cfe1d3846238ef84c968924e89b14d9/pydbal-0.7.tar.gz" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "b9d631a05f343a2cf5a10d886b4446a7", "sha256": "38dc607b26b87627bbe82c45d24e4d8baf1b5c8c5189a24d32eb2812314bd2dd" }, "downloads": -1, "filename": "pydbal-0.8.tar.gz", "has_sig": false, "md5_digest": "b9d631a05f343a2cf5a10d886b4446a7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26556, "upload_time": "2016-04-28T18:26:56", "url": "https://files.pythonhosted.org/packages/e4/1a/e76992aeaa95f3d9a2de03bd2a441dfe421d9c61f781846e789bf01a1153/pydbal-0.8.tar.gz" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "ad2624b246f8dfaba7fcae6011c3d22a", "sha256": "97150559ed25fb1045d80e374f26873d5424a15b042afb8bbf22f86b23e27f96" }, "downloads": -1, "filename": "pydbal-0.9.tar.gz", "has_sig": false, "md5_digest": "ad2624b246f8dfaba7fcae6011c3d22a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26559, "upload_time": "2016-05-13T12:17:55", "url": "https://files.pythonhosted.org/packages/40/ab/b36122059d92e85bab833ac51fa186b1feb5aa11e95435ab7cd518fed10a/pydbal-0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3e546be78cfa02d04787d295d52af416", "sha256": "1e89e9e87dc170f6fd487cbc93d9d5e8c86b810efdd5981a905c065ddf00c54c" }, "downloads": -1, "filename": "pydbal-0.12.tar.gz", "has_sig": false, "md5_digest": "3e546be78cfa02d04787d295d52af416", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28247, "upload_time": "2016-06-24T16:24:06", "url": "https://files.pythonhosted.org/packages/45/62/6b00e5f477690e260853e6f7ef71987791668ca58501314fb0162d2754d8/pydbal-0.12.tar.gz" } ] }