The database is OK. I found out that calling func.datetime on value in
declarative filtering fixed query and returned expected result.
query = query.filter(Invoice.InvoiceDate == func.datetime(datetime.datetime(
2007, 1, 1)))
echo:
SELECT "Invoice"."InvoiceId" AS "Invoice_InvoiceId", "Invoice"."InvoiceDate"
AS "Invoice_InvoiceDate"
FROM "Invoice"
WHERE "Invoice"."InvoiceDate" = datetime(:datetime_1)
2015-06-04 15:13:58,297 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2015-06-04 15:13:58,298 INFO sqlalchemy.engine.base.Engine SELECT "Invoice".
"InvoiceId" AS "Invoice_InvoiceId", "Invoice"."InvoiceDate" AS
"Invoice_InvoiceDate"
FROM "Invoice"
WHERE "Invoice"."InvoiceDate" = datetime(?)
2015-06-04 15:13:58,298 INFO sqlalchemy.engine.base.Engine ('2007-01-01
00:00:00.000000',)
declarative: 1
Now I'm thinking how I could make it more general for any SQLite Datetime
type.
Having read
http://docs.sqlalchemy.org/en/latest/core/custom_types.html#applying-sql-level-bind-result-processing
I'm trying with making custom type that would by default call that
func.datetime.
class SQLiteDateTime(DateTime):
def bind_expression(self, bindvalue):
return func.datetime(bindvalue, type_=self)
So far no luck but is it right approach for that problem?
Thanks,
Mike
On Thursday, June 4, 2015 at 1:50:58 PM UTC-4, Michael Bayer wrote:
>
>
>
> On 6/4/15 11:57 AM, mdob wrote:
>
> Hi,
>
> It seems I have different result when filtering sqlite database on
> datetime column.
>
> I don't get any results when filtering declarative way
> Invoice.InvoiceDate == datetime.datetime(2007, 01, 01)
> same when hen executing raw query with engine.execute
> 'select * from Invoice where InvoiceDate = "2007-01-01"'
> but it works when using sqlite datetime function in sql statement
> 'select * from Invoice where InvoiceDate = datetime("2007-01-01") '
>
> My objective is to be able to filter declarative way and I'm not sure
> either I am missing something or there's an issue with declarative
> filtering. Any Ideas?
>
>
> the literal string 'datetime("2007-01-01")' is probably what is directly
> present in the database. I'd guess some prior version of the application
> or other weird event is responsible for this, I'd log into the database
> using sqlite3 directly just to see if this is the case, and then look into
> repairing that data.
>
>
>
>
> Below some testing code and here's link to chinook databases
> http://chinookdatabase.codeplex.com/
>
> Any help much appreciated.
> Mike
>
> import datetime
> from sqlalchemy import create_engine, text, Column, Integer, DateTime
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy.orm import sessionmaker
>
> Base = declarative_base()
>
> class Invoice(Base):
> __tablename__ = 'Invoice'
>
> InvoiceId = Column(Integer, primary_key=True)
> InvoiceDate = Column(DateTime)
>
> def __repr__(self):
> return 'Invoice {}'.format(self.InvoiceId)
>
>
> engine = create_engine('sqlite:////home/mike/chinook.sqlite')
>
> def declarative():
> Session = sessionmaker(bind=engine)
>
> session = Session()
> query = session.query(Invoice)
> query = query.filter(Invoice.InvoiceDate == datetime.datetime(2007,
> 01, 01))
> result = query.all()
> for invoice in result:
> print invoice.InvoiceId, invoice.InvoiceDate
> print 'declarative:', len(result)
>
>
> def core():
> sql = text('select * from Invoice where InvoiceDate = "2007-01-01"')
> query = engine.execute(sql)
> result = query.fetchall()
> print 'core: ', len(result)
>
>
> def core_fun():
> sql = text('select * from Invoice where InvoiceDate =
> datetime("2007-01-01") ')
> query = engine.execute(sql)
> result = query.fetchall()
> print 'core with datetime fun: ', len(result)
>
>
> declarative()
> core()
> core_fun()
>
>
> Result
>
> declarative: 0
> core: 0
> core with datetime fun: 1
>
> --
> 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] <javascript:>.
> To post to this group, send email to [email protected]
> <javascript:>.
> Visit this group at http://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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.