From 9cbf10f2a8811d84b2051b6b1d2a9c2b78b4a4bb Mon Sep 17 00:00:00 2001 From: Denis Rouzaud Date: Tue, 9 Apr 2024 17:16:52 +0200 Subject: [PATCH] support for both psycopg2 and 3 (#32) * support for both psycopg2 and 3 * fix * more imports * monkey patch * update PG versions * adapt README --- .github/workflows/test.yml | 6 ++++-- .gitignore | 1 + README.md | 2 ++ pirogue/information_schema.py | 5 ++++- pirogue/multiple_inheritance.py | 8 +++++++- pirogue/simple_joins.py | 5 ++++- pirogue/single_inheritance.py | 5 ++++- pirogue/utils.py | 5 ++++- pyproject.toml | 2 ++ requirements-psycopg2.txt | 1 + requirements-psycopg3.txt | 1 + requirements.txt | 1 - test/test_multiple_inheritance.py | 6 +++++- test/test_simple_joins.py | 6 +++++- 14 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 requirements-psycopg2.txt create mode 100644 requirements-psycopg3.txt diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 58f2ad3..431583b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,8 @@ jobs: strategy: matrix: - pg-version: ['9.6', '10', '11'] + psycopg-version: [2, 3] + pg-version: [12, 13, 14, 15, 16] fail-fast: true # Service containers to run with `runner-job` @@ -59,9 +60,10 @@ jobs: run: | pip install -r requirements.txt pip install -r requirements-test.txt + pip install -r requirements-psycopg${{ matrix.psycopg-version }}.txt - name: Install pirogue - run: python -m pip install -e . + run: python -m pip install -e .[psycopg${{ matrix.psycopg-version }}] - name: Setup tests run: | diff --git a/.gitignore b/.gitignore index 14793ad..cc42d68 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ __pycache__/ *.egg-info .idea .DS_Store +*.orig diff --git a/README.md b/README.md index a2b3f91..22902b3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ # pirogue A tool to automatically create views and triggers on PostgreSQL databases +It supports both psycopg 2 and 3. One or the other is required. + Read the docs: https://opengisch.github.io/pirogue diff --git a/pirogue/information_schema.py b/pirogue/information_schema.py index 6e00d6e..1eea4db 100644 --- a/pirogue/information_schema.py +++ b/pirogue/information_schema.py @@ -1,4 +1,7 @@ -from psycopg import Cursor +try: + from psycopg import Cursor +except ImportError: + from psycopg2.extensions import cursor as Cursor from pirogue.exceptions import ( InvalidSkipColumns, diff --git a/pirogue/multiple_inheritance.py b/pirogue/multiple_inheritance.py index e6c227f..a986cfd 100644 --- a/pirogue/multiple_inheritance.py +++ b/pirogue/multiple_inheritance.py @@ -1,6 +1,12 @@ import os -import psycopg +try: + import psycopg +except ImportError: + import psycopg2 as psycopg + import psycopg2.sql as __sql + + psycopg.sql = __sql from pirogue.exceptions import InvalidDefinition, TableHasNoPrimaryKey, VariableError from pirogue.information_schema import ( diff --git a/pirogue/simple_joins.py b/pirogue/simple_joins.py index 0511f1b..35e3dc9 100644 --- a/pirogue/simple_joins.py +++ b/pirogue/simple_joins.py @@ -1,6 +1,9 @@ import os -import psycopg +try: + import psycopg +except ImportError: + import psycopg2 as psycopg from pirogue.exceptions import InvalidDefinition, NoReferenceFound, TableHasNoPrimaryKey from pirogue.information_schema import primary_key, reference_columns diff --git a/pirogue/single_inheritance.py b/pirogue/single_inheritance.py index 5806aac..5a5c315 100644 --- a/pirogue/single_inheritance.py +++ b/pirogue/single_inheritance.py @@ -1,6 +1,9 @@ import os -import psycopg +try: + import psycopg +except ImportError: + import psycopg2 as psycopg from pirogue.exceptions import TableHasNoPrimaryKey from pirogue.information_schema import default_value, primary_key, reference_columns diff --git a/pirogue/utils.py b/pirogue/utils.py index ba4b7dc..5c20226 100644 --- a/pirogue/utils.py +++ b/pirogue/utils.py @@ -1,4 +1,7 @@ -from psycopg import Cursor +try: + from psycopg import Cursor +except ImportError: + from psycopg2.extensions import cursor as Cursor from pirogue.exceptions import InvalidColumn, TableHasNoPrimaryKey from pirogue.information_schema import columns, default_value, primary_key diff --git a/pyproject.toml b/pyproject.toml index d5f6147..622dcf0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,6 +36,8 @@ enabled = true readme = {file = ["README.md"], content-type = "text/markdown"} dependencies = {file = ["requirements.txt"]} optional-dependencies.test = {file = ["requirements-test.txt"]} +optional-dependencies.psycopg2 = {file = ["requirements-psycopg2.txt"]} +optional-dependencies.psycopg3 = {file = ["requirements-psycopg3.txt"]} [tool.isort] profile = "black" diff --git a/requirements-psycopg2.txt b/requirements-psycopg2.txt new file mode 100644 index 0000000..a635bb3 --- /dev/null +++ b/requirements-psycopg2.txt @@ -0,0 +1 @@ +psycopg2>=2.9.9 diff --git a/requirements-psycopg3.txt b/requirements-psycopg3.txt new file mode 100644 index 0000000..20c05d9 --- /dev/null +++ b/requirements-psycopg3.txt @@ -0,0 +1 @@ +psycopg>=3.1.18 diff --git a/requirements.txt b/requirements.txt index e93b153..19e91bc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1 @@ pyyaml>=6.0.1 -psycopg>=3.1.18 diff --git a/test/test_multiple_inheritance.py b/test/test_multiple_inheritance.py index 42a1d66..fe36364 100644 --- a/test/test_multiple_inheritance.py +++ b/test/test_multiple_inheritance.py @@ -2,7 +2,11 @@ import unittest -import psycopg +try: + import psycopg +except ImportError: + import psycopg2 as psycopg + import yaml from pirogue import MultipleInheritance diff --git a/test/test_simple_joins.py b/test/test_simple_joins.py index 65c04d6..5879392 100644 --- a/test/test_simple_joins.py +++ b/test/test_simple_joins.py @@ -2,7 +2,11 @@ import unittest -import psycopg +try: + import psycopg +except ImportError: + import psycopg2 as psycopg + import yaml from pirogue import MultipleInheritance, SimpleJoins