Re: [sqlalchemy] concerns over generating a bitwise comparison in postgres - (or "can columns be explicit in a text filter?"

2016-09-28 Thread Jonathan Vanasco
Ok. I'll put a note on the code and leave as is.

The cast/bit/op is just too hard to read for maintenance.  BUT it might be 
okay in one spot as a compiles function.  I think i may do that!

Thanks, Mike!


-- 
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.


Re: [sqlalchemy] concerns over generating a bitwise comparison in postgres - (or "can columns be explicit in a text filter?"

2016-09-28 Thread Mike Bayer



On 09/27/2016 05:12 PM, Jonathan Vanasco wrote:


Let's say that I have a table such as this:

 CREATE TABLE foo (
 id SERIAL PRIMARY KEY,
 attribute_toggles INT DEFAULT NULL
 );
CREATE INDEX idx_attribute_toggles ON foo(CAST(attribute_toggles AS
BIT(32))) WHERE attribute_toggles  <> 0;

represented by such a class

class Foo():
__tablename__ = 'foo'
id = Column(Integer(primary_key=True))
attribute_toggles = Column(Integer())

and I need to generate the sql:

  SELECT * FROM foo WHERE (CAST(attribute_toggles AS BIT(32)) &
CAST(1 AS BIT(32)) <> CAST (0 AS BIT(32))) AND attribute_toggles > 0;

The casting and `>0` comparison are used to filter on the index instead
of a sequential scan.  that drops a query from around 4000ms to 30ms.

Is it ok/reliable just doing this:

foos = session.query(Foo)\
.filter("""(cast(attribute_toggles as bit(32)) &
cast(:bit_wanted as bit(32)) <> cast(0 as bit(32))) AND
attribute_toggles > 0""",
)\
.params(bit_wanted = bit_wanted,
)\
.order_by(Foo.id.desc())\
.limit(limit)\
.offset(offset)\
.all()

Writing out the filter in SqlAlchemy was getting messy, so I went for a
text filter.

My concern is that the textual filter doesn't specify what
`attribute_toggles` is.  The sqlalchemy core has a somewhat similar
`columns` construct for statements, but that's not applicable here.

i made a few attempts to specify the columns using various sqlalchemy
features that I'm familiar with, but i had no luck.


well it will work as long as that column name is non-ambiguous.  If you 
started using Foo + FooAlias together, then it would have problems.   In 
that case using plain cast() / BIT / op() would be the quickest 
solution.   Or a @compiles construct if you really want the string thing 
to be present.







--
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.


--
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.