diff --git a/compatibility-fix-for-sqlalchemy2.patch b/compatibility-fix-for-sqlalchemy2.patch new file mode 100644 index 0000000..67b140b --- /dev/null +++ b/compatibility-fix-for-sqlalchemy2.patch @@ -0,0 +1,78 @@ +From 9963b0f467c7931370087711890c74e397d996ca Mon Sep 17 00:00:00 2001 +From: Mattia Verga +Date: Sun, 26 Feb 2023 12:01:26 +0100 +Subject: [PATCH] Use session to connect to db + +--- + sqlalchemy_schemadisplay.py | 19 ++++++++++++++----- + 1 file changed, 14 insertions(+), 5 deletions(-) + +diff --git a/sqlalchemy_schemadisplay.py b/sqlalchemy_schemadisplay.py +index 6bbf947..bad4940 100644 +--- a/sqlalchemy_schemadisplay.py ++++ b/sqlalchemy_schemadisplay.py +@@ -1,5 +1,7 @@ + # updated SQLA schema display to work with pydot 1.0.2 + ++from packaging import version ++from sqlalchemy import __version__ as sqlaver + from sqlalchemy.orm.properties import RelationshipProperty + from sqlalchemy.orm import sync + import pydot +@@ -106,7 +108,7 @@ def calc_label(src,dest): + + + def _render_table_html( +- table, metadata, ++ session, table, + show_indexes, show_datatypes, show_column_keys, show_schema_name, + format_schema_name, format_table_name + ): +@@ -168,9 +170,9 @@ def format_name(obj_name, format_dict): + ) + + html += ''.join('%s' % (col.name, format_col_str(col)) for col in table.columns) +- if metadata.bind and isinstance(metadata.bind.dialect, PGDialect): ++ if session.bind and isinstance(session.bind.dialect, PGDialect): + # postgres engine doesn't reflect indexes +- indexes = dict((name,defin) for name,defin in metadata.bind.execute( ++ indexes = dict((name,defin) for name,defin in session.bind.execute( + text("SELECT indexname, indexdef FROM pg_indexes WHERE tablename = '%s'" % table.name) + )) + if indexes and show_indexes: +@@ -182,11 +184,12 @@ def format_name(obj_name, format_dict): + html += '>' + return html + +-def create_schema_graph(tables=None, metadata=None, show_indexes=True, show_datatypes=True, font="Bitstream-Vera Sans", ++def create_schema_graph(session=None, tables=None, metadata=None, show_indexes=True, show_datatypes=True, font="Bitstream-Vera Sans", + concentrate=True, relation_options={}, rankdir='TB', show_column_keys=False, restrict_tables=None, + show_schema_name=False, format_schema_name=None, format_table_name=None): + """ + Args: ++ - session (sqlalchemy.orm.session.Session): A database session. + - metadata (sqlalchemy.MetaData, default=None): SqlAlchemy `MetaData` with reference to related tables. If none + is provided, uses metadata from first entry of `tables` argument. + - concentrate (bool, default=True): Specifies if multiedges should be merged into a single edge & partially +@@ -222,6 +225,12 @@ def create_schema_graph(tables=None, metadata=None, show_indexes=True, show_data + else: + raise ValueError("You need to specify at least tables or metadata") + ++ if session is None: ++ if version.parse(sqlaver) >= version.parse('2.0.0'): ++ raise ValueError("You need to set up and provide a database session with sqlalchemy >= 2") ++ else: ++ session = metadata ++ + # check if unexpected keys were used in format_schema_name param + if format_schema_name is not None and \ + len(set(format_schema_name.keys()).difference({'color','fontsize', 'italics', 'bold'})) > 0: +@@ -242,7 +251,7 @@ def create_schema_graph(tables=None, metadata=None, show_indexes=True, show_data + graph.add_node(pydot.Node(str(table.name), + shape="plaintext", + label=_render_table_html( +- table, metadata, ++ session, table, + show_indexes, show_datatypes, show_column_keys, show_schema_name, + format_schema_name, format_table_name + ), diff --git a/python-sqlalchemy_schemadisplay.spec b/python-sqlalchemy_schemadisplay.spec index 1c03f82..0c4ae8f 100644 --- a/python-sqlalchemy_schemadisplay.spec +++ b/python-sqlalchemy_schemadisplay.spec @@ -9,6 +9,8 @@ Summary: Turn SQLAlchemy DB Model into a graph License: MIT URL: https://github.com/fschulze/%{srcname} Source0: %{url}/archive/%{gittag}/%{srcname}-%{version}.tar.gz +# https://github.com/fschulze/sqlalchemy_schemadisplay/pull/34 +Patch: compatibility-fix-for-sqlalchemy2.patch BuildArch: noarch BuildRequires: python3-devel