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 <mike...@zzzcomputing.com>wrote:

>
> On Jul 12, 2013, at 5:53 PM, Basil Veerman <bveer...@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+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