Finally with some fluff removed...
#!/usr/bin/env python
import sqlalchemy
from sqlalchemy import text, create_engine
stmt = text('WITH J1(JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID, JOBMST_TYPE,
LVL) AS (' +
'SELECT JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID, JOBMST_TYPE, 1 '
+
'FROM TIDAL.JOBMST ' +
'WHERE JOBMST_PRNTID IS NULL ' +
'UNION ALL ' +
'SELECT J2.JOBMST_ID, J2.JOBMST_NAME, J2.JOBMST_PRNTID,
J2.JOBMST_TYPE, ' +
'J1.LVL + 1 ' +
'FROM TIDAL.JOBMST J2 ' +
'INNER JOIN J1 ON J2.JOBMST_PRNTID = J1.JOBMST_ID '
'WHERE J2.JOBMST_PRNTID IS NOT NULL ' +
') SEARCH DEPTH FIRST BY JOBMST_NAME SET DISP_SEQ ' +
'SELECT * ' +
'FROM ( SELECT A.*, rownum rn ' +
'FROM ( SELECT * '
'FROM J1 ' +
'ORDER BY DISP_SEQ) A ' +
'WHERE rownum <= :f) ' +
'WHERE rn >= :s')
engine = create_engine('oracle://TIDAL:Password123@WINTIDAL:1521/ORCL',
echo=False) #echo='debug'
connection = engine.connect()
offset = 0 #42735 |||| #42736 records.. ROWCOUNT starts from 1, not 0 in
ORACLE database.
limit = 2
more_results = True
while more_results:
start = offset + 1
finish = offset + limit
print('Start: {0}, Finish {1}'.format(start,finish))
partial_results = connection.execute(stmt, s = start, f =
finish).fetchall()
offset += limit
if partial_results == []:
more_results = False
else:
for row in partial_results:
print(row.items())
if offset == 4:
more_results = False
connection.close()
On Fri, Apr 27, 2018 at 6:43 PM, Jeremy Flowers <[email protected]>
wrote:
> Thanks.
>
> On Fri, Apr 27, 2018 at 6:08 PM, Mike Bayer <[email protected]>
> wrote:
>
>> you don't really need the columns(...) part if you are sending the
>> text() object to connection.execute(). That's mostly a thing to help
>> when using the ORM which I don't think you want to be using here.
>>
>> Also set echo='debug' on create_engine which will log all the rows
>> coming back.
>>
>> On Fri, Apr 27, 2018 at 12:12 PM, Jeremy Flowers
>> <[email protected]> wrote:
>> > Hah.. Seems Oracle ROWNUM starts from 1, not 0..
>> > When you select between 3 and 4 - nothing returns. There's an Oracle
>> > quirk...
>> >
>> > On Fri, Apr 27, 2018 at 5:03 PM, Jeremy Flowers <
>> [email protected]>
>> > wrote:
>> >>
>> >> Have tried dropping session.execute and using connection.execute -
>> where
>> >> the method of parameter binding seems to work...
>> >>
>> >> ==
>> >>
>> >> #!/usr/bin/env python
>> >> import sqlalchemy
>> >> from sqlalchemy.types import Integer
>> >> from sqlalchemy.sql.expression import bindparam
>> >> from sqlalchemy import text, create_engine, column
>> >> stmt = text('WITH J1(JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID,
>> JOBMST_TYPE,
>> >> LVL) AS (' +
>> >> 'SELECT JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID,
>> JOBMST_TYPE, 1
>> >> ' +
>> >> 'FROM TIDAL.JOBMST ' +
>> >> 'WHERE JOBMST_PRNTID IS NULL ' +
>> >> 'UNION ALL ' +
>> >> 'SELECT J2.JOBMST_ID, J2.JOBMST_NAME, J2.JOBMST_PRNTID,
>> >> J2.JOBMST_TYPE, ' +
>> >> 'J1.LVL + 1 ' +
>> >> 'FROM TIDAL.JOBMST J2 ' +
>> >> 'INNER JOIN J1 ON J2.JOBMST_PRNTID = J1.JOBMST_ID '
>> >> 'WHERE J2.JOBMST_PRNTID IS NOT NULL ' +
>> >> ') SEARCH DEPTH FIRST BY JOBMST_NAME SET DISP_SEQ ' +
>> >> 'SELECT * ' +
>> >> 'FROM J1 '+
>> >> 'WHERE ROWNUM BETWEEN :s AND :f ' +
>> >> 'ORDER BY DISP_SEQ ')
>> >> stmt.columns(column('JOBMST_ID'), column('JOBMST_NAME'),
>> >> column('JOBMST_PRNT_ID'), column('LVL'),column('DISP_SEQ'))
>> >> stmt.bindparams(bindparam('s', type_=Integer), bindparam('f',
>> >> type_=Integer))
>> >> engine = create_engine('oracle://TIDAL:Password123@WINTIDAL:1521/ORCL
>> ',
>> >> echo=True)
>> >> connection = engine.connect()
>> >> offset = 0
>> >> limit = 2
>> >> more_results = True
>> >> while more_results:
>> >> start = offset
>> >> finish = offset + limit - 1
>> >> print('Start: {0}, Finish {1}'.format(start,finish))
>> >> partial_results = connection.execute(stmt, s = start, f =
>> >> finish).fetchall()
>> >> offset += limit
>> >> if partial_results == [] or offset == 4:
>> >> more_results = False
>> >> for row in partial_results:
>> >> print(row.items())
>> >> connection.close()
>> >>
>> >> ===
>> >>
>> >> C:\opt\tidalconversion>jobwalktext.py
>> >> 2018-04-27 16:44:58,037 INFO sqlalchemy.engine.base.Engine SELECT USER
>> >> FROM DUAL
>> >> 2018-04-27 16:44:58,037 INFO sqlalchemy.engine.base.Engine {}
>> >> 2018-04-27 16:44:58,040 INFO sqlalchemy.engine.base.Engine SELECT
>> >> CAST('test plain returns' AS VARCHAR(60 CHAR)) AS anon_1 FROM DUAL
>> >> 2018-04-27 16:44:58,040 INFO sqlalchemy.engine.base.Engine {}
>> >> 2018-04-27 16:44:58,041 INFO sqlalchemy.engine.base.Engine SELECT
>> >> CAST('test unicode returns' AS NVARCHAR2(60)) AS anon_1 FROM DUAL
>> >>
>> >> C:\opt\tidalconversion>jobwalktext.py
>> >> 2018-04-27 16:58:13,199 INFO sqlalchemy.engine.base.Engine SELECT USER
>> >> FROM DUAL
>> >> 2018-04-27 16:58:13,199 INFO sqlalchemy.engine.base.Engine {}
>> >> 2018-04-27 16:58:13,202 INFO sqlalchemy.engine.base.Engine SELECT
>> >> CAST('test plain returns' AS VARCHAR(60 CHAR)) AS anon_1 FROM
>> DUAL2018-04-27
>> >> 16:58:13,202 INFO sqlalchemy.engine.base.Engine {}2018-04-27
>> 16:58:13,203
>> >> INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns'
>> AS
>> >> NVARCHAR2(60)) AS anon_1 FROM DUAL2018-04-27 16:58:13,203 INFO
>> >> sqlalchemy.engine.base.Engine {}2018-04-27 16:58:13,204 INFO
>> >> sqlalchemy.engine.base.Engine select value from nls_session_parameters
>> where
>> >> parameter = 'NLS_NUMERIC_CHARACTERS'
>> >> 2018-04-27 16:58:13,204 INFO sqlalchemy.engine.base.Engine {}
>> >> Start: 0, Finish 1
>> >> 2018-04-27 16:58:13,206 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, 1 FROM TIDAL.JOBMST
>> >> WHERE JOBMST_PRNTID IS NULL UNION ALL SELECT J2.JOBMST_ID,
>> J2.JOBMST_NAME,
>> >> J2.JOBMST_PRNTID, J2.JOBMST_TYPE, J1.LVL + 1 FROM TIDAL.JOBMST J2
>> INNER JOIN
>> >> J1 ON J2.JOBMST_PRNTID = J1.JOBMST_ID WHERE J2.JOBMST_PRNTID IS NOT
>> NULL )
>> >> SEARCH DEPTH FIRST BY JOBMST_NAME SET DISP_SEQ SELECT * FROM J1 WHERE
>> ROWNUM
>> >> BETWEEN :s AND :f ORDER BY DISP_SEQ2018-04-27 16:58:13,207 INFO
>> >> sqlalchemy.engine.base.Engine {'s': 0, 'f': 1}[('jobmst_id', 57020),
>> >> ('jobmst_name', '6G_ZAFIN_PROD'), ('jobmst_prntid', None),
>> ('jobmst_type',
>> >> 1), ('lvl', 1), ('disp_seq', 1)]
>> >> Start: 2, Finish 3
>> >> 2018-04-27 16:58:13,510 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, 1 FROM TIDAL.JOBMST
>> >> WHERE JOBMST_PRNTID IS NULL UNION ALL SELECT J2.JOBMST_ID,
>> J2.JOBMST_NAME,
>> >> J2.JOBMST_PRNTID, J2.JOBMST_TYPE, J1.LVL + 1 FROM TIDAL.JOBMST J2
>> INNER JOIN
>> >> J1 ON J2.JOBMST_PRNTID = J1.JOBMST_ID WHERE J2.JOBMST_PRNTID IS NOT
>> NULL )
>> >> SEARCH DEPTH FIRST BY JOBMST_NAME SET DISP_SEQ SELECT * FROM J1 WHERE
>> ROWNUM
>> >> BETWEEN :s AND :f ORDER BY DISP_SEQ
>> >> 2018-04-27 16:58:13,511 INFO sqlalchemy.engine.base.Engine {'s': 2,
>> 'f':
>> >> 3}
>> >>
>> >> C:\opt\tidalconversion>
>> >>
>> >> ===
>> >>
>> >> For some bizarre reasone, the tuple for the row only prints first
>> record..
>> >> I can see the record selection works correctly.. had to move where
>> above
>> >> order by since before..
>> >> It seems the parameter binding works fine. Don't thing I necessarly
>> needed
>> >> have stmt.bindparams - seemed to work equally well without that.
>> >> Anyone see anything obvious?
>> >> ==
>> >> Here's same output with , echo=False
>> >> ==
>> >> C:\opt\tidalconversion>jobwalktext.py
>> >> Start: 0, Finish 1
>> >> [('jobmst_id', 57020), ('jobmst_name', '6G_ZAFIN_PROD'),
>> ('jobmst_prntid',
>> >> None), ('jobmst_type', 1), ('lvl', 1), ('disp_seq', 1)]
>> >> Start: 2, Finish 3
>> >>
>> >> C:\opt\tidalconversion>
>> >>
>> >> On Fri, Apr 27, 2018 at 4:12 PM, Jeremy Flowers
>> >> <[email protected]> wrote:
>> >>>
>> >>> I'm thinking along these lines. But can't get it to work.
>> >>> #!/usr/bin/env python
>> >>> import sqlalchemy
>> >>> from sqlalchemy import text, create_engine, column
>> >>> from sqlalchemy.orm import Session, sessionmaker
>> >>> stmt = text('''WITH J1(JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID,
>> >>> JOBMST_TYPE, LVL) AS (
>> >>> SELECT JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID,
>> >>> JOBMST_TYPE, 1
>> >>> FROM TIDAL.JOBMST
>> >>> WHERE JOBMST_PRNTID IS NULL
>> >>> UNION ALL
>> >>> SELECT J2.JOBMST_ID, J2.JOBMST_NAME,
>> J2.JOBMST_PRNTID,
>> >>> J2.JOBMST_TYPE,
>> >>> J1.LVL + 1
>> >>> FROM TIDAL.JOBMST J2
>> >>> INNER JOIN J1 ON J2.JOBMST_PRNTID = J1.JOBMST_ID
>> >>> WHERE J2.JOBMST_PRNTID IS NOT NULL
>> >>> ) SEARCH DEPTH FIRST BY JOBMST_NAME SET DISP_SEQ
>> >>> SELECT *
>> >>> FROM J1
>> >>> ORDER BY DISP_SEQ
>> >>> WHERE ROWNUM BETWEEN :s AND :f
>> >>> ''')
>> >>> stmt.columns(column('JOBMST_ID'), column('JOBMST_NAME'),
>> >>> column('JOBMST_PRNT_ID'), column('LVL'),column('DISP_SEQ'))
>> >>> engine = create_engine('oracle://TIDAL:Password123@WINTIDAL:1521/ORCL
>> ',
>> >>> echo=False)
>> >>> Session = sessionmaker(bind=engine)
>> >>> ses = Session()
>> >>> more_results = True
>> >>> offset = 0
>> >>> limit = 2
>> >>> while more_results:
>> >>> start = offset
>> >>> finish = offset + limit - 1
>> >>> partial_results = ses.execute(stmt, s = start, f = finish)
>> >>> offset += limit
>> >>> if partial_results == [] or offset == 4:
>> >>> more_results = False
>> >>> for row in partial_results:
>> >>> print(row.items())
>> >>>
>> >>> Getting
>> >>> TypeError: get_bind() got an unexpected keyword argument 's'
>> >>>
>> >>> Got idea from here...
>> >>> https://security.openstack.org/guidelines/dg_parameterize-
>> database-queries.html
>> >>> - it's obviously wrong!
>> >>>
>> >>> On Fri, Apr 27, 2018 at 3:49 PM, Jeremy Flowers
>> >>> <[email protected]> wrote:
>> >>>>
>> >>>> Right so some sort of statement bind..
>> >>>> Just found this didn't work:
>> >>>>
>> >>>> #!/usr/bin/env python
>> >>>> import sqlalchemy
>> >>>> from sqlalchemy import text, create_engine, column
>> >>>> from sqlalchemy.orm import Session, sessionmaker
>> >>>> stmt = text('''WITH J1(JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID,
>> >>>> JOBMST_TYPE, LVL) AS (
>> >>>> SELECT JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID,
>> >>>> JOBMST_TYPE, 1
>> >>>> FROM TIDAL.JOBMST
>> >>>> WHERE JOBMST_PRNTID IS NULL
>> >>>> UNION ALL
>> >>>> SELECT J2.JOBMST_ID, J2.JOBMST_NAME,
>> J2.JOBMST_PRNTID,
>> >>>> J2.JOBMST_TYPE,
>> >>>> J1.LVL + 1
>> >>>> FROM TIDAL.JOBMST J2
>> >>>> INNER JOIN J1 ON J2.JOBMST_PRNTID = J1.JOBMST_ID
>> >>>> WHERE J2.JOBMST_PRNTID IS NOT NULL
>> >>>> ) SEARCH DEPTH FIRST BY JOBMST_NAME SET DISP_SEQ
>> >>>> SELECT *
>> >>>> FROM J1
>> >>>> ORDER BY DISP_SEQ''')
>> >>>> stmt.columns(column('JOBMST_ID'), column('JOBMST_NAME'),
>> >>>> column('JOBMST_PRNT_ID'), column('LVL'),column('DISP_SEQ'))
>> >>>> engine = create_engine('oracle://TIDAL:Password123@WINTIDAL
>> :1521/ORCL',
>> >>>> echo=False)
>> >>>> Session = sessionmaker(bind=engine)
>> >>>> ses = Session()
>> >>>> more_results = True
>> >>>> offset = 0
>> >>>> limit = 2
>> >>>> while more_results:
>> >>>> partial_results = ses.execute(stmt).offset(offset).limit(limit)
>> >>>> offset += limit
>> >>>> if partial_results == [] or offset == 4:
>> >>>> more_results = False
>> >>>> for row in partial_results:
>> >>>> print(row.items())
>> >>>>
>> >>>> On Fri, Apr 27, 2018 at 3:19 PM, Simon King <[email protected]>
>> >>>> wrote:
>> >>>>>
>> >>>>> No, you'll need to convert that to the equivalent SQL.
>> >>>>>
>> >>>>> On Fri, Apr 27, 2018 at 3:14 PM, Jeremy Flowers
>> >>>>> <[email protected]> wrote:
>> >>>>> > But can you still do things like slice(0,5)? Struggling to get
>> that
>> >>>>> > to work
>> >>>>> > atm...
>> >>>>> >
>> >>>>> > On Fri, Apr 27, 2018 at 2:48 PM, Simon King <
>> [email protected]>
>> >>>>> > wrote:
>> >>>>> >>
>> >>>>> >> On Fri, Apr 27, 2018 at 12:57 PM, Jeremy Flowers
>> >>>>> >> <[email protected]> wrote:
>> >>>>> >> > Right...
>> >>>>> >> > Been trawling back thru this chain of exchanges..
>> >>>>> >> > Looking for this:
>> >>>>> >> >>
>> >>>>> >> >> At this point I would echo Mike's question: why can't you just
>> >>>>> >> >> use
>> >>>>> >> >> "text()"?
>> >>>>> >> >
>> >>>>> >> > Just spotted another comment from Mike, that I've just fixed
>> >>>>> >> > too...
>> >>>>> >> >>
>> >>>>> >> >> the literal() has to be against the regular value 1 and not
>> the
>> >>>>> >> >> string...
>> >>>>> >> >
>> >>>>> >> >
>> >>>>> >> >> as a practical matter, this query is Oracle-specific in any
>> >>>>> >> >> case, is there a reason you can't just use text() ? The
>> reason
>> >>>>> >> >> text() exists is for when one has the exact SQL they want
>> already
>> >>>>> >> >> and
>> >>>>> >> >> there is no need to work it into the expression language.
>> >>>>> >> >
>> >>>>> >> >
>> >>>>> >> > Can I just put that into some sort of session execute?
>> >>>>> >> > If there's a relevant example someone can point me to, it would
>> >>>>> >> > help.
>> >>>>> >> > I'll
>> >>>>> >> > have a dig around.
>> >>>>> >> >
>> >>>>> >>
>> >>>>> >> There are a few examples of using text() with the ORM here:
>> >>>>> >>
>> >>>>> >>
>> >>>>> >>
>> >>>>> >> http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#using
>> -textual-sql
>> >>>>> >>
>> >>>>> >> session.execute() behaves more like the Core-level
>> >>>>> >> connection.execute(), which is described here:
>> >>>>> >>
>> >>>>> >>
>> >>>>> >>
>> >>>>> >> http://docs.sqlalchemy.org/en/latest/core/tutorial.html#sqle
>> xpression-text
>> >>>>> >>
>> >>>>> >> Simon
>> >>>>> >>
>> >>>>> >> --
>> >>>>> >> 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 a topic
>> in
>> >>>>> >> the
>> >>>>> >> Google Groups "sqlalchemy" group.
>> >>>>> >> To unsubscribe from this topic, visit
>> >>>>> >>
>> >>>>> >> https://groups.google.com/d/topic/sqlalchemy/aWJT1VdY3LU/uns
>> ubscribe.
>> >>>>> >> To unsubscribe from this group and all its topics, send an email
>> to
>> >>>>> >> [email protected].
>> >>>>> >> To post to this group, send email to [email protected]
>> .
>> >>>>> >> 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 [email protected].
>> >>>>> > To post to this group, send email to [email protected].
>> >>>>> > 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 a topic in
>> the
>> >>>>> Google Groups "sqlalchemy" group.
>> >>>>> To unsubscribe from this topic, visit
>> >>>>> https://groups.google.com/d/topic/sqlalchemy/aWJT1VdY3LU/uns
>> ubscribe.
>> >>>>> To unsubscribe from this group and all its topics, send an email to
>> >>>>> [email protected].
>> >>>>> To post to this group, send email to [email protected].
>> >>>>> 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 [email protected].
>> > To post to this group, send email to [email protected].
>> > 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 a topic in the
>> Google Groups "sqlalchemy" group.
>> To unsubscribe from this topic, visit https://groups.google.com/d/to
>> pic/sqlalchemy/aWJT1VdY3LU/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to
>> [email protected].
>> To post to this group, send email to [email protected].
>> 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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.