Hi All,
With SA 0.5.8 on Python 2.5, the attached test_with_default blows up with:
Traceback (most recent call last):
File "test_default_arg_sqlite.py", line 46, in test_with_default
peterb2 = session.query(PersonWITH).filter_by(name='PeterB').first()
File
"/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.8-py2.5.egg/sqlalchemy/orm/query.py",
line 1300, in first
ret = list(self[0:1])
File
"/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.8-py2.5.egg/sqlalchemy/orm/query.py",
line 1221, in __getitem__
return list(res)
File
"/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.8-py2.5.egg/sqlalchemy/orm/query.py",
line 1422, in instances
rows = [process[0](context, row) for row in fetch]
File
"/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.8-py2.5.egg/sqlalchemy/orm/query.py",
line 2032, in main
return _instance(row, None)
File
"/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.8-py2.5.egg/sqlalchemy/orm/mapper.py",
line 1748, in _instance
populate_state(state, dict_, row, isnew, attrs,
instancekey=identitykey)
File
"/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.8-py2.5.egg/sqlalchemy/orm/mapper.py",
line 1618, in populate_state
populator(state, dict_, row, isnew=isnew, **flags)
File
"/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.8-py2.5.egg/sqlalchemy/orm/strategies.py",
line 120, in new_execute
dict_[key] = row[col]
File
"/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.8-py2.5.egg/sqlalchemy/engine/base.py",
line 1348, in __getitem__
return self.__parent._get_col(self.__row, key)
File
"/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.8-py2.5.egg/sqlalchemy/engine/base.py",
line 1620, in _get_col
return processor(row[index])
File
"/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.8-py2.5.egg/sqlalchemy/databases/sqlite.py",
line 183, in process
return fn(*[int(x or 0) for x in regexp.match(value).groups()])
TypeError: expected string or buffer
The problem is the default on the birthday column.
Is this a bug in the sqllite dialect or does the problem lie elsewhere?
cheers,
Chris
from decimal import Decimal
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.schema import Column
from sqlalchemy.types import Integer, String, Numeric, Date
import datetime
import unittest
import sqlite3
sqlite3.register_adapter(Decimal, str)
sqlite3.register_converter('NUMERIC', Decimal)
class Test(unittest.TestCase):
def create_session(self,Base):
engine = create_engine('sqlite://',
echo=False,
encoding='utf-8',
pool_recycle=3600,
connect_args={'detect_types':
sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES})
Base.metadata.create_all(engine)
return sessionmaker(bind=engine, autoflush=True, autocommit=False)()
def test_with_default(self):
Base = declarative_base()
class PersonWITH(Base):
__tablename__ = 'person_wi'
id = Column(Integer, primary_key=True)
name = Column(String(80), unique=True)
age = Column(Numeric(precision=36, scale=12))
money = Column(Numeric(precision=36, scale=12), index=True)
birthday = Column(Date, default=datetime.date.today)
session = self.create_session(Base)
try:
peterb = PersonWITH(name='PeterB', age='42.1')
session.add(peterb)
session.commit()
peterb2 = session.query(PersonWITH).filter_by(name='PeterB').first()
self.assertEquals(peterb, peterb2)
self.assertEquals(peterb.age,Decimal('42.1'))
self.assertEquals(peterb2.age,Decimal('42.1'))
self.assertTrue(isinstance(peterb2.age,Decimal))
finally:
session.close()
def test_without_default(self):
Base = declarative_base()
class PersonWO(Base):
__tablename__ = 'person_wo'
id = Column(Integer, primary_key=True)
name = Column(String(80), unique=True)
age = Column(Numeric(precision=36, scale=12))
money = Column(Numeric(precision=36, scale=12), index=True)
birthday = Column(Date)
session = self.create_session(Base)
try:
peterb = PersonWO(name='PeterB', age='42.1')
session.add(peterb)
session.commit()
peterb2 = session.query(PersonWO).filter_by(name='PeterB').first()
self.assertEquals(peterb, peterb2)
self.assertEquals(peterb.age,Decimal('42.1'))
self.assertEquals(peterb2.age,Decimal('42.1'))
self.assertTrue(isinstance(peterb2.age,Decimal))
finally:
session.close()
if __name__ == "__main__":
unittest.main()
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.