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 <bveer...@uvic.ca> 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+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.
>  
>  

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


Reply via email to