That seems wrong what version of SQLAlchemy is that ? Make sure you are on the latest.
On Mon, Apr 23, 2018, 4:36 PM Jeremy Flowers <jeremy.g.flow...@gmail.com> wrote: > I've had a go at trying to adapt your code: > > import tidal > from sqlalchemy import create_engine, Column > from sqlalchemy.dialects import oracle > from sqlalchemy.orm import aliased > from sqlalchemy.orm.session import sessionmaker > from sqlalchemy.orm.query import Query > from sqlalchemy.sql import select > from sqlalchemy.sql.expression import literal, text > from tidal import Jobmst > engine = create_engine('oracle://TIDAL:Password123@WINTIDAL:1521/ORCL', > echo=True) > Session = sessionmaker(bind=engine) > sel = select([Jobmst.jobmst_id, Jobmst.jobmst_name, Jobmst.jobmst_prntid, > Jobmst.jobmst_type]) > j2 = aliased(sel, name='j2') > ses = Session() > j1 = ses.query( > sel, literal('1').label('lvl') > ).filter(Jobmst.jobmst_prntid == None).cte(recursive=True,name='j1') > j1 = j1.union_all( > ses.query(j2, j1.c.lvl + 1 > ).join(j1, j2.c.jobmst_prntid == j1.c.jobmst_id > ).filter(Jobmst.jobmst_prntid != None) > ) > stmt = ses.query(j1).prefix_with( > 'SEARCH DEPTH FIRST BY JOBMST_NAME SET DISP_SEQ' > ).order_by(text('DISP_SEQ')) > print(stmt.statement.compile(dialect=oracle.dialect())) > print(stmt.first()) > > When I run it. I get this > > c:\opt\tidalconversion>cd c:\opt\tidalconversion && cmd /C "set " > PYTHONIOENCODING=UTF-8" && set "PYTHONUNBUFFERED=1" && python > C:\Users\administrator\.vscode\extensions\ms-python.python-2018.3.1\pythonFiles\PythonTools\visualstudio_py_launcher_nodebug.py > c:\opt\tidalconversion 58494 34806ad9-833a-4524-8cd6-18ca4aa74f14 > RedirectOutput,RedirectOutput c:\opt\tidalconversion\jobwalk.py " > WITH j1(jobmst_id, jobmst_name, jobmst_prntid, jobmst_type, lvl) AS > (SELECT jobmst_id, jobmst_name, jobmst_prntid, jobmst_type, :param_1 AS > lvl > FROM (SELECT jobmst.jobmst_id AS jobmst_id, jobmst.jobmst_name AS > jobmst_name, jobmst.jobmst_prntid AS jobmst_prntid, jobmst.jobmst_type AS > jobmst_type > FROM jobmst), jobmst > WHERE jobmst.jobmst_prntid IS NULL UNION ALL SELECT j2.jobmst_id AS > j2_jobmst_id, j2.jobmst_name AS j2_jobmst_name, j2.jobmst_prntid AS > j2_jobmst_prntid, j2.jobmst_type AS j2_jobmst_type, j1.lvl + :lvl_1 AS > anon_1 > FROM jobmst, (SELECT jobmst.jobmst_id AS jobmst_id, jobmst.jobmst_name AS > jobmst_name, jobmst.jobmst_prntid AS jobmst_prntid, jobmst.jobmst_type AS > jobmst_type > FROM jobmst) j2 JOIN j1 ON j2.jobmst_prntid = j1.jobmst_id > WHERE jobmst.jobmst_prntid IS NOT NULL) > SELECT SEARCH DEPTH FIRST BY JOBMST_NAME SET DISP_SEQ j1.jobmst_id, j1. > jobmst_name, j1.jobmst_prntid, j1.jobmst_type, j1.lvl > FROM j1 ORDER BY DISP_SEQ2018-04-23 21:32:26,345 INFO sqlalchemy.engine. > base.Engine SELECT USER FROM DUAL2018-04-23 21:32:26,346 INFO sqlalchemy. > engine.base.Engine {}2018-04-23 21:32:26,349 INFO sqlalchemy.engine.base. > Engine SELECT CAST('test plain returns' AS VARCHAR(60 CHAR)) AS anon_1 > FROM DUAL2018-04-23 21:32:26,350 INFO sqlalchemy.engine.base.Engine {}2018 > -04-23 21:32:26,350 INFO sqlalchemy.engine.base.Engine SELECT CAST('test > unicode returns' AS NVARCHAR2(60)) AS anon_1 FROM DUAL2018-04-23 21:32:26, > 351 INFO sqlalchemy.engine.base.Engine {}2018-04-23 21:32:26,352 INFO > sqlalchemy.engine.base.Engine select value from nls_session_parameters > where parameter = 'NLS_NUMERIC_CHARACTERS'2018-04-23 21:32:26,352 INFO > sqlalchemy.engine.base.Engine {}2018-04-23 21:32:26,353 INFO sqlalchemy. > engine.base.Engine BEGIN (implicit) > 2018-04-23 21:32:26,355 INFO sqlalchemy.engine.base.Engine WITH j1( > jobmst_id, jobmst_name, jobmst_prntid, jobmst_type, lvl) AS > (SELECT jobmst_id, jobmst_name, jobmst_prntid, jobmst_type, :param_1 AS > lvl > FROM (SELECT jobmst.jobmst_id AS jobmst_id, jobmst.jobmst_name AS > jobmst_name, jobmst.jobmst_prntid AS jobmst_prntid, jobmst.jobmst_type AS > jobmst_type > FROM jobmst), jobmst > WHERE jobmst.jobmst_prntid IS NULL UNION ALL SELECT j2.jobmst_id AS > j2_jobmst_id, j2.jobmst_name AS j2_jobmst_name, j2.jobmst_prntid AS > j2_jobmst_prntid, j2.jobmst_type AS j2_jobmst_type, j1.lvl + :lvl_1 AS > anon_1 > FROM jobmst, (SELECT jobmst.jobmst_id AS jobmst_id, jobmst.jobmst_name AS > jobmst_name, jobmst.jobmst_prntid AS jobmst_prntid, jobmst.jobmst_type AS > jobmst_type > FROM jobmst) j2 JOIN j1 ON j2.jobmst_prntid = j1.jobmst_id > WHERE jobmst.jobmst_prntid IS NOT NULL) > SELECT j1_jobmst_id, j1_jobmst_name, j1_jobmst_prntid, j1_jobmst_type, > j1_lvl > FROM (SELECT SEARCH DEPTH FIRST BY JOBMST_NAME SET DISP_SEQ j1.jobmst_id > AS j1_jobmst_id, j1.jobmst_name AS j1_jobmst_name, j1.jobmst_prntid AS > j1_jobmst_prntid, j1.jobmst_type AS j1_jobmst_type, j1.lvl AS j1_lvl > FROM j1 ORDER BY DISP_SEQ) > WHERE ROWNUM <= :param_2 > 2018-04-23 21:32:26,356 INFO sqlalchemy.engine.base.Engine {'param_1': '1' > , 'lvl_1': 1, 'param_2': 1} > Traceback (most recent call last): File > "C:\Users\administrator\.vscode\extensions\ms-python.python-2018.3.1\pythonFiles\PythonTools\visualstudio_py_launcher_nodebug.py" > , line 74, in run > _vspu.exec_file(file, globals_obj) > File > "C:\Users\administrator\.vscode\extensions\ms-python.python-2018.3.1\pythonFiles\PythonTools\visualstudio_py_util.py" > , line 119, in exec_file > exec_code(code, file, global_variables) > File > "C:\Users\administrator\.vscode\extensions\ms-python.python-2018.3.1\pythonFiles\PythonTools\visualstudio_py_util.py" > , line 95, in exec_code > exec(code_obj, global_variables) > File "c:\opt\tidalconversion\jobwalk.py", line 27, in <module> > print(stmt.first()) > File "C:\opt\python\3.6.5-x64\lib\site-packages\sqlalchemy\orm\query.py" > , line 2789, in first > ret = list(self[0:1]) > File "C:\opt\python\3.6.5-x64\lib\site-packages\sqlalchemy\orm\query.py" > , line 2581, in __getitem__ > return list(res) > File "C:\opt\python\3.6.5-x64\lib\site-packages\sqlalchemy\orm\query.py" > , line 2889, in __iter__ > return self._execute_and_instances(context) > File "C:\opt\python\3.6.5-x64\lib\site-packages\sqlalchemy\orm\query.py" > , line 2912, in _execute_and_instances > result = conn.execute(querycontext.statement, self._params) > File > "C:\opt\python\3.6.5-x64\lib\site-packages\sqlalchemy\engine\base.py", > line 948, in execute > return meth(self, multiparams, params) > File > "C:\opt\python\3.6.5-x64\lib\site-packages\sqlalchemy\sql\elements.py", > line 269, in _execute_on_connection > return connection._execute_clauseelement(self, multiparams, params) > File > "C:\opt\python\3.6.5-x64\lib\site-packages\sqlalchemy\engine\base.py", > line 1060, in _execute_clauseelement > compiled_sql, distilled_params > File > "C:\opt\python\3.6.5-x64\lib\site-packages\sqlalchemy\engine\base.py", > line 1200, in _execute_context > context) > File > "C:\opt\python\3.6.5-x64\lib\site-packages\sqlalchemy\engine\base.py", > line 1413, in _handle_dbapi_exception > exc_info > File > "C:\opt\python\3.6.5-x64\lib\site-packages\sqlalchemy\util\compat.py", > line 203, in raise_from_cause > reraise(type(exception), exception, tb=exc_tb, cause=cause) > File > "C:\opt\python\3.6.5-x64\lib\site-packages\sqlalchemy\util\compat.py", > line 186, in reraise > raise value.with_traceback(tb) > File > "C:\opt\python\3.6.5-x64\lib\site-packages\sqlalchemy\engine\base.py", > line 1193, in _execute_context > context) > File > "C:\opt\python\3.6.5-x64\lib\site-packages\sqlalchemy\engine\default.py", > line 507, in do_execute > cursor.execute(statement, parameters) > sqlalchemy.exc.DatabaseError: (cx_Oracle.DatabaseError) ORA-00923: FROM > keyword not found where expected [SQL: 'WITH j1(jobmst_id, jobmst_name, > jobmst_prntid, jobmst_type, lvl) AS \n(SELECT jobmst_id, jobmst_name, > jobmst_prntid, jobmst_type, :param_1 AS lvl \nFROM (SELECT jobmst.jobmst_id > AS jobmst_id, jobmst.jobmst_name AS jobmst_name, jobmst.jobmst_prntid AS > jobmst_prntid, jobmst.jobmst_type AS jobmst_type \nFROM jobmst), jobmst > \nWHERE jobmst.jobmst_prntid IS NULL UNION ALL SELECT j2.jobmst_id AS > j2_jobmst_id, j2.jobmst_name AS j2_jobmst_name, j2.jobmst_prntid AS > j2_jobmst_prntid, j2.jobmst_type AS j2_jobmst_type, j1.lvl + :lvl_1 AS > anon_1 \nFROM jobmst, (SELECT jobmst.jobmst_id AS jobmst_id, > jobmst.jobmst_name AS jobmst_name, jobmst.jobmst_prntid AS jobmst_prntid, > jobmst.jobmst_type AS jobmst_type \nFROM jobmst) j2 JOIN j1 ON > j2.jobmst_prntid = j1.jobmst_id \nWHERE jobmst.jobmst_prntid IS NOT NULL)\n > SELECT j1_jobmst_id, j1_jobmst_name, j1_jobmst_prntid, j1_jobmst_type, > j1_lvl \nFROM (SELECT SEARCH DEPTH FIRST BY JOBMST_NAME SET DISP_SEQ > j1.jobmst_id AS j1_jobmst_id, j1.jobmst_name AS j1_jobmst_name, > j1.jobmst_prntid AS j1_jobmst_prntid, j1.jobmst_type AS j1_jobmst_type, > j1.lvl AS j1_lvl \nFROM j1 ORDER BY DISP_SEQ) \nWHERE ROWNUM <= :param_2'] > [parameters: {'param_1': '1', 'lvl_1': 1, 'param_2': 1}] (Background on > this error at: http://sqlalche.me/e/4xp6) > > Any ideas on what I need to do to fix this? > > -- > SQLAlchemy - > The Python SQL Toolkit and Object Relational Mapper > > http://www.sqlalchemy.org/ > > To post example code, please provide an MCVE: Minimal, Complete, and > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > description. > --- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sqlalchemy+unsubscr...@googlegroups.com. > To post to this group, send email to sqlalchemy@googlegroups.com. > Visit this group at https://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. > -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.