On 05/20/2016 08:53 AM, John Omernik wrote:
Awesome, I am making some progress, I realized that the visit_join I had
was specific to Microsoft access, so I commented it out to see what
happened... that function was somehow not using the ?. When I commented
it out I got "better" sql:
OK so the example of the "access" dialect is referred to in order to
illustrate the layout of files for a third-party dialect, such that it
plugs into SQLAlchemy smoothly.
However, the "access" dialect from a "works really well with MS Access"
standpoint is not very good at all, as MS Access is not really well
supported by the odbc driver, or PyODBC, or as far as providing a robust
SQL dialect that we can make good use of. So it's not great as an
example of how to use the internal dialect APIs.
To learn about the hooks and flags that Dialect subclasses really make
use of, you should look in the dialects that are *included* with
SQLAlchemy since they really cover the span of the kinds of things that
are needed. Look in the source under lib/sqlalchemy/dialects and
compare and contrast Postgresql, MySQL, SQLite, Oracle, SQL server. I
think looking at these is how most people learn the basics of getting a
dialect to work.
Access visit_join:
def visit_join(self, join, asfrom=False, **kwargs):
return ( self.process(join.left, asfrom=True) + \
(join.isouter and " LEFT OUTER JOIN " or " INNER JOIN ") + \
self.process(join.right, asfrom=True) + " ON " + \
self.process(join.onclause) )
SELECT field1 AS field1, COUNT(*) AS cnt
FROM table INNER JOIN (SELECT field1 AS __field1
FROM table GROUP BY field1 ORDER BY COUNT(*) DESC
LIMIT ?) AS anon_1 ON field1 = __field1 GROUP BY field1 ORDER BY cnt DESC
LIMIT 5000
No visit_join
SELECT field1 AS field1, COUNT(*) AS cnt
FROM table JOIN (SELECT field1 AS __field1
FROM table GROUP BY field1 ORDER BY COUNT(*) DESC
LIMIT 50) AS anon_1 ON field1 = __field1 GROUP BY field1 ORDER BY cnt DESC
LIMIT 5000
This is better! Now, the only question I have now is how I can create a
visit_join (or perhaps this goes elsewhere) where the "ON field1 =
__field1" can actually be ON field1 = anon_1.__field1 Drill doesn't
like field1 = __field1, says its ambiguous. Is there an easy way to do
this rather than trying to manually rewrite the statement. (For example,
anon_1 is being put in by something, and it's non-obvious to me, but I
don't want hard code anon_1 in a dialect...
Thanks for your help thus far in pointing me in the right direction.
John
On Thu, May 19, 2016 at 7:50 PM, John Omernik <[email protected]
<mailto:[email protected]>> wrote:
Hey Mike, thanks for the reply. I feel really bad in that I am
struggling on this, a little background, I am trying to get Caravel,
which uses SQL Alchemy to play nice with Apache Drill, this means I
am learning about dialects through a crash course of feeling really
dumb, I've had some success (with help) and have some aspects
working great. One of the things I am struggling with is the "How"
to trouble shoot when, for example Caravel is issuing a Query that
should have a limit, but instead comes through like this:
SELECT myfield AS myfield, COUNT(*) AS cnt
FROM mytable INNER JOIN (SELECT myfield AS __myfield
FROM mytable GROUP BY myfield ORDER BY COUNT(*) DESC
LIMIT ?) AS anon_1 ON myfield = __myfield GROUP BY myfield ORDER BY cnt
DESC
LIMIT 5000
So this hos Drill receives the query and it fails. There are two
things wrong here, first is the limits. Now, why the query is build
this way is beyond me (I can't tell if its Caravel building it that
way or SQL Alchemy, but the the self join makes no sense to me... it
seems redudant, but I digress.) There are two LIMITS, the first is
the ? which I am assuming should be the parameter from Caravel, and
then LIMIT 5000. I am guessing that the limit 5000 is put on by
CARAVEL as that is the max row count... but why this is failing is
beyond me, it doesn't work on my drill/pyodbc setup, but when it's
the sqllite dialect on a sqllite test database, that works fine...
The second issue is the join. Drill finds the myfield =
__myfield ambiguous. I just need to find how I could tell
SQLAlchemy to qualify the __myfield with the anon_1. I can't tell if
that is SQL Alchemy thing or a caravel thing. I am still digging,
and will continue to, but if you or anyone here could help me debug
and/or point me in the right direction, I figured it would be good
to articulate my thoughts.
On Thu, May 19, 2016 at 6:31 PM, Mike Bayer
<[email protected] <mailto:[email protected]>> wrote:
a SQL query that uses parameters will use ? if the DBAPI uses
"qmark" paramstyle which is very common. The actual value that
lines up with the ? is part of the "parameters" sequence. The
specification for this is at
https://www.python.org/dev/peps/pep-0249/#id15 which also links
out to paramstyle.
On 05/19/2016 05:27 PM, John Omernik wrote:
I am writing my own dialect, and for some reason, when my
application
sets a limit via parameter, the query submitted to the back
end just has
? in it. Is this an issue with the dialect, the pyodbc
(doubt it's
that), or the ODBC driver itself?
Thanks, John
--
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]
<mailto:sqlalchemy%[email protected]>
<mailto:[email protected]
<mailto:sqlalchemy%[email protected]>>.
To post to this group, send email to
[email protected] <mailto:[email protected]>
<mailto:[email protected]
<mailto:[email protected]>>.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.
--
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]
<mailto:sqlalchemy%[email protected]>.
To post to this group, send email to [email protected]
<mailto:[email protected]>.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.
--
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]
<mailto:[email protected]>.
To post to this group, send email to [email protected]
<mailto:[email protected]>.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.
--
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.