Sounds great, thanks. On Wednesday, 17 July 2013 19:35:48 UTC-7, Michael Bayer wrote: > > well we try to get releases out every 4-6 weeks but sometimes it takes > longer. though this issue was a surprise and does lean things towards > releasing sooner. > > > > On Jul 17, 2013, at 12:38 PM, Basil Veerman <bvee...@uvic.ca <javascript:>> > wrote: > > Hi Michael, > > Thanks for your help. Using 0.8.3 and the type variant passes our tests. > > Do you have any (even rough) estimate as to when 0.8.3 will be released to > PyPI? > > Thanks, > Basil > > On Friday, 12 July 2013 18:56:14 UTC-7, Michael Bayer wrote: >> >> Right, DateTime + with_variant() + sqlite.DATETIME with a custom storage >> format and regexp. *However*. There's an unfortunate case that the >> storage format/regexp arguments, introduced in 0.8.0, are not actually >> working fully, and I've just committed the fix. So you'll have to use >> 0.8.3 for now, which is not released you can get it via >> https://bitbucket.org/zzzeek/sqlalchemy/get/rel_0_8.tar.gz . >> >> Example: >> >> from sqlalchemy import Column, BigInteger, Float, String, DateTime, >> Integer >> from sqlalchemy.ext.declarative import declarative_base >> from sqlalchemy.dialects import sqlite >> import re >> >> Base = declarative_base() >> >> # needs SQLAlchemy 0.8.3 to work correctly >> sqlite_date = DateTime(timezone=False).with_variant( >> sqlite.DATETIME( >> >> storage_format="%(year)04d-%(month)02d-%(day)02dT%(hour)02d:%(minute)02d:%(second)02d", >> regexp=r"(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)", >> ), "sqlite") >> >> >> class Obs(Base): >> __tablename__ = 'obs_raw' >> id = Column('obs_raw_id', BigInteger, primary_key=True) >> time = Column('obs_time', sqlite_date) >> datum = Column(Float) >> >> from sqlalchemy.orm import sessionmaker >> from sqlalchemy import create_engine >> >> engine = create_engine('sqlite:///test.db', echo=True) >> >> Session = sessionmaker(bind=engine) >> session = Session() >> >> for ob in session.query(Obs.time): >> print ob >> >> >> >> On Jul 12, 2013, at 8:56 PM, Basil Veerman <basilv...@gmail.com> wrote: >> >> Here is a short example that illustrates the original error: >> >> *Create Test Database:* >> >> $ sqlite3 testing.sqlite >> SQLite version 3.7.13 2012-06-11 02:05:22 >> Enter ".help" for instructions >> Enter SQL statements terminated with a ";" >> sqlite> BEGIN TRANSACTION; >> sqlite> CREATE TABLE 'obs_raw' ('obs_raw_id' INTEGER PRIMARY KEY, >> 'obs_time' TIMESTAMP, 'mod_time' TIMESTAMP, 'datum' FLOAT); >> sqlite> INSERT INTO "obs_raw" >> VALUES(32568805,'2004-05-18T00:00:00','2011-08-29T12:13:18',21.0); >> sqlite> INSERT INTO "obs_raw" >> VALUES(32568806,'2004-05-19T00:00:00','2011-08-29T12:13:18',19.3); >> sqlite> INSERT INTO "obs_raw" >> VALUES(32568807,'2004-05-20T00:00:00','2011-08-29T12:13:18',20.8); >> sqlite> INSERT INTO "obs_raw" >> VALUES(32568808,'2004-05-21T00:00:00','2011-08-29T12:13:18',17.8); >> sqlite> INSERT INTO "obs_raw" >> VALUES(32568809,'2004-05-22T00:00:00','2011-08-29T12:13:18',19.4); >> sqlite> COMMIT; >> sqlite> .exit >> >> *Basic python test:* >> >> from sqlalchemy import Column, BigInteger, Float, String, DateTime >> from sqlalchemy.ext.declarative import declarative_base >> >> Base = declarative_base() >> >> class Obs(Base): >> __tablename__ = 'obs_raw' >> id = Column('obs_raw_id', BigInteger, primary_key=True) >> time = Column('obs_time', DateTime(timezone=True)) >> datum = Column(Float) >> >> from sqlalchemy.orm import sessionmaker >> from sqlalchemy import create_engine >> >> engine = create_engine('sqlite+pysqlite:///testing.sqlite') >> Session = sessionmaker(bind=engine) >> session = Session() >> >> for ob in session.query(Obs.time): >> print ob >> >> *Results when run:* >> >> File "test_datetime.py", line 19, in <module> >> for ob in session.query(Obs.time): >> File >> "/home/bveerman/.local/lib/python2.7/site-packages/sqlalchemy/orm/loading.py", >> >> line 75, in instances >> labels) for row in fetch] >> File >> "/home/bveerman/.local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", >> line 3157, in proc >> return row[column] >> ValueError: Couldn't parse datetime string: u'2004-05-18T00:00:00' >> >> >> >> On Fri, Jul 12, 2013 at 4:50 PM, Michael Bayer >> <mik...@zzzcomputing.com>wrote: >> >>> >>> On Jul 12, 2013, at 5:53 PM, Basil Veerman <bvee...@uvic.ca> wrote: >>> >>> Hi, >>> >>> I've been struggling for a while trying to create a mapping that works >>> with both PostGIS >>> >>> >>> what's a PostGIS database? do you mean a Postgresql database with >>> spatial extensions installed? >>> >>> >>> Background: Production PostGIS database has been reduced and converted >>> to a spatialite database with the same schema for offline testing purposes. >>> >>> Problem: PostGIS TIMESTAMP is now stored as SQLite TIMESTAMP, but >>> effectively as a string. I think the main problems is that the default >>> SQLite DateTime dialect storage_format includes miliseconds, our data does >>> not. >>> >>> >>> OK the DATETIME object that's in the SQLite dialect supports >>> customization of this, but if your data doesnt have milliseconds, it just >>> stores it as zero. I'm not sure what the problem is exactly. >>> >>> >>> >>> A solution which seems to be working is to declare a TypeDecorator and >>> set the Column type to it: >>> >>> class SQLiteDateTime(types.TypeDecorator): >>> impl = types.String >>> >>> def process_bind_param(self, value, dialect): >>> return datetime.strftime(value, '%Y-%m-%dT%H:%M:%S') >>> >>> def process_result_value(self, value, dialect): >>> return datetime.strptime(value, '%Y-%m-%dT%H:%M:%S') >>> >>> This works as expected for SQLite, however does not for PostGIS (unless >>> checking for dialect.name = 'sqlite'...) >>> >>> >>> I think you should be using plain old DateTime here, but if you need >>> DateTime with SQLite's DATETIME object specially configured, you can do >>> this: >>> >>> from sqlalchemy.dialects.sqlite import DATETIME >>> datetime = DateTime.with_variant(DATETIME(truncate_milliseconds=True)) >>> >>> if you want to stick with TypeDecorator, use load_dialect_impl(): >>> >>> class MyType(TypeDecorator): >>> # ... >>> >>> def load_dialect_impl(self, dialect): >>> if dialect.name == 'sqlite': >>> return DATETIME(...) >>> else: >>> return DateTime(...) >>> >>> >>> >>> Overriding type compilation seems to be exactly what I need, however, as >>> per the example: >>> >>> >>> I'm completely confused by that. type compilation only regards how the >>> type is rendered in a CREATE TABLE statement, it has nothing to do with how >>> data is marshalled into it. >>> >>> >>> >>> Currently these are both at the top of a mapping file which all the >>> tables are declared. Am I just missing something about compile time >>> overrides? >>> >>> >>> I really need to see a comprehensive, short example illustrating what >>> exactly the issue is since it's not at all clear. >>> >>> >>> >>> -- >>> 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/ZuH7W1qeSsQ/unsubscribe. >>> To unsubscribe from this group and all its topics, send an email to >>> sqlalchemy+...@googlegroups.com. >>> To post to this group, send email to sqlal...@googlegroups.com. >>> Visit this group at http://groups.google.com/group/sqlalchemy. >>> For more options, visit https://groups.google.com/groups/opt_out. >>> >>> >>> >> >> >> -- >> 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+...@googlegroups.com. >> To post to this group, send email to sqlal...@googlegroups.com. >> Visit this group at http://groups.google.com/group/sqlalchemy. >> For more options, visit https://groups.google.com/groups/opt_out. >> >> >> >> >> > -- > 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+...@googlegroups.com <javascript:>. > To post to this group, send email to sqlal...@googlegroups.com<javascript:> > . > Visit this group at http://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/groups/opt_out. > > > > >
-- 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 http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/groups/opt_out.