You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I hope you have tried checking if the OpenEdge is supported as the documentation says. I tried this but didn't work. The connection establishment works fine (using python manage.py runserver) but the queries made to OpenEdge database are not correct. I fixed most of them by hand and reached to the point where at least the server was started without any errors.
Below are the errors that I got (in the same order) and fixed them by hand to make it work.
Error on fetching TABLES from OpenEdge DB:
Query:
File "/usr/local/lib/python2.7/dist-packages/django_pyodbc-1.1.0-py2.7.egg/django_pyodbc/introspection.py", line 95, in get_table_list
cursor.execute("SELECT TABLE_NAME, 't' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'")
Error:
File "/usr/local/lib/python2.7/dist-packages/django_pyodbc-1.1.0-py2.7.egg/django_pyodbc/base.py", line 495, in execute
raise utils.DatabaseError(*e.args)
django.db.utils.DatabaseError: ('HY000', '[HY000] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]Table/view/synonynm "INFORMATION_SCHEMA.TABLES" cannot be found. (15814) (-210083) (SQLExecDirectW)')
Correct Query should be:
if<is_opendge>:
cursor.execute("SELECT TBL, 't' FROM SYSPROGRESS.SYSTABLES WHERE TBLTYPE = 'T'")
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/base.py", line 604, in schema_editor
'The SchemaEditorClass attribute of this database wrapper is still None')
NotImplementedError: The SchemaEditorClass attribute of this database wrapper is still None
I commented the call to schema_editor (in recorder.py) since it tries to create tables using create_model. There should be some way to control this. I don't want to create/change my OpenEdge schema over this API. Perhaps I'm too new to this area that I don't know how to control this behaviour. It would be nice if you can guide me on this.
This can be controlled by disabling self.check_migrations for OpenEdge connections but that has to be done in django's runserver.py file. So this error does not concern this adapter.
AttributeError:
Error:
File "/usr/local/lib/python2.7/dist-packages/django_pyodbc-1.1.0-py2.7.egg/django_pyodbc/compiler.py", line 204, in as_sql
self._fix_aggregates()
File "/usr/local/lib/python2.7/dist-packages/django_pyodbc-1.1.0-py2.7.egg/django_pyodbc/compiler.py", line 180, in _fix_aggregates
for alias, aggregate in self.query.aggregate_select.items():
AttributeError: 'Query' object has no attribute 'aggregate_select'
The _fix_aggregates function perhaps is meant to counter some MSSQL behaviour as the comment says in the code. I'm not 100% sure though. Again I used self.connection.ops.is_openedge and prevent the execution of that function.
Migration problem again:
Error:
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute return self.cursor.execute(sql, params)
File "/usr/local/lib/python2.7/dist-packages/django_pyodbc-1.1.0-py2.7.egg/django_pyodbc/base.py", line 496, in execute raise utils.DatabaseError(*e.args)
django.db.utils.DatabaseError: ('HY000', '[HY000] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]Table/view/synonynm "AKGULERI.django_migrations" cannot be found. (15814) (-210083) (SQLExecDirectW)')
This might be Django framework itself but it tries get something Djnago specific which is not available in OpenEdge DB. Here too I made a dirty fix and avoided execution of such query by replacing it with simple query i.e. SELECT TOP 1 * FROM SYSPROGRESS.SYSTABLES. Any guidance on this would be helpful as well.
This can be controlled by disabling self.check_migrations for OpenEdge connections but that has to be done in django's runserver.py file. So this error does not concern this adapter.
Query quotes: After all this the server started I created a simple model for Customer table (having Meta class db_table = 'PUB.CUSTOMER') of the connected OpenEdge DB. Then using shell I created a instance of Customer and tried to fetch some data using customer.objects.get(pk=1) but was returned the below with an error on the shell. The query it formed was something like this SELECT "PUB.CUSTOMER"."custnum", "PUB.CUSTOMER"."name", "PUB.CUSTOMER"."city" FROM "PUB.CUSTOMER" WHERE "PUB.CUSTOMER"."custnum" = ?
This query did not yield any result until the quotes were. So I change the function quote_name in operations.py to return unquoted name variable if self.is_openedge. Progress does support querying with quotes but this was perhaps an odd occasion where this query was not formed correctly.
Now (finally :)) the query customer.objects.get(pk=1) gets me results from the DB. But perhaps these fixes should be done properly into the django-pyodbc code.
The text was updated successfully, but these errors were encountered:
AkshayGuleria
changed the title
Does OpenEdge support work?
OpenEdge support not working in master. Some basic fixes here
May 23, 2017
Some details before we start:
I hope you have tried checking if the OpenEdge is supported as the documentation says. I tried this but didn't work. The connection establishment works fine (using python manage.py runserver) but the queries made to OpenEdge database are not correct. I fixed most of them by hand and reached to the point where at least the server was started without any errors.
Below are the errors that I got (in the same order) and fixed them by hand to make it work.
Query:
Error:
Correct Query should be:
Error:
I commented the call to schema_editor (in recorder.py) since it tries to create tables using create_model. There should be some way to control this. I don't want to create/change my OpenEdge schema over this API. Perhaps I'm too new to this area that I don't know how to control this behaviour. It would be nice if you can guide me on this.
Error:
The _fix_aggregates function perhaps is meant to counter some MSSQL behaviour as the comment says in the code. I'm not 100% sure though. Again I used
self.connection.ops.is_openedge
and prevent the execution of that function.Error:
This might be Django framework itself but it tries get something Djnago specific which is not available in OpenEdge DB. Here too I made a dirty fix and avoided execution of such query by replacing it with simple query i.e.
SELECT TOP 1 * FROM SYSPROGRESS.SYSTABLES
. Any guidance on this would be helpful as well.customer.objects.get(pk=1)
but was returned the below with an error on the shell. The query it formed was something like thisSELECT "PUB.CUSTOMER"."custnum", "PUB.CUSTOMER"."name", "PUB.CUSTOMER"."city" FROM "PUB.CUSTOMER" WHERE "PUB.CUSTOMER"."custnum" = ?
This query did not yield any result until the quotes were. So I change the function quote_name in operations.py to return unquoted name variable if self.is_openedge. Progress does support querying with quotes but this was perhaps an odd occasion where this query was not formed correctly.
Now (finally :)) the query customer.objects.get(pk=1) gets me results from the DB. But perhaps these fixes should be done properly into the django-pyodbc code.
The text was updated successfully, but these errors were encountered: