missing is_scalar on Sequence

Issue #2303 resolved
Former user created an issue

I'm using SA 0.7.3 on Postgresql 8.4. The sequence is defined as:

id = sa.Column('id', sa.Integer, sa.Sequence('table_id_seq'), primary_key=True)

When insert into an empty table I get the error below. If I added an is_scalar attribute manually to DefaultGenerator then everything seems to work but I'm not sure if this is the right way.

File "./bauble/plugins/imex/csv_.py", line 487, in run do_insert() File "./bauble/plugins/imex/csv_.py", line 434, in do_insert connection.execute(insert, values) File "/home/brett/.virtualenvs/bauble-trunk/lib/python2.6/site-packages/SQLAlchemy-0.7.3-py2.6-linux-i686.egg/sqlalchemy/engine/base.py", line 1399, in execute params) File "/home/brett/.virtualenvs/bauble-trunk/lib/python2.6/site-packages/SQLAlchemy-0.7.3-py2.6-linux-i686.egg/sqlalchemy/engine/base.py", line 1554, in _execute_compiled compiled, parameters File "/home/brett/.virtualenvs/bauble-trunk/lib/python2.6/site-packages/SQLAlchemy-0.7.3-py2.6-linux-i686.egg/sqlalchemy/engine/base.py", line 1599, in _execute_context None, None) File "/home/brett/.virtualenvs/bauble-trunk/lib/python2.6/site-packages/SQLAlchemy-0.7.3-py2.6-linux-i686.egg/sqlalchemy/engine/base.py", line 1595, in _execute_context context = constructor(dialect, self, conn, args) File "/home/brett/.virtualenvs/bauble-trunk/lib/python2.6/site-packages/SQLAlchemy-0.7.3-py2.6-linux-i686.egg/sqlalchemy/engine/default.py", line 440, in _init_compiled self.__process_defaults() File "/home/brett/.virtualenvs/bauble-trunk/lib/python2.6/site-packages/SQLAlchemy-0.7.3-py2.6-linux-i686.egg/sqlalchemy/engine/default.py", line 767, in __process_defaults if self.isinsert and c.default and c.default.is_scalar(): StatementError: 'Sequence' object has no attribute 'is_scalar' (original cause: AttributeError: 'Sequence' object has no attribute 'is_scalar') 'INSERT INTO habit (name, code, id, _created, _last_updated) VALUES (%(name)s, %(code)s, %(id)s, %(_created)s, %(_last_updated)s)' ({'_created': datetime.datetime(2011, 10, 18, 14, 45, 11, 131138, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), '_last_updated': datetime.datetime(2011, 10, 18, 14, 45, 11, 132150, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), 'code': u'AQU', 'name': u'Aquatic'}, {'_created': datetime.datetime(2011, 10, 18, 14, 45, 11, 131138, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), '_last_updated': datetime.datetime(2011, 10, 18, 14, 45, 11, 132150, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), 'code': u'CAC', 'name': u'Cactus'}, {'_created': datetime.datetime(2011, 10, 18, 14, 45, 11, 131138, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), '_last_updated': datetime.datetime(2011, 10, 18, 14, 45, 11, 132150, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), 'code': u'CLI_D', 'name': u'Climber, Deciduous'}, {'_created': datetime.datetime(2011, 10, 18, 14, 45, 11, 131138, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), '_last_updated': datetime.datetime(2011, 10, 18, 14, 45, 11, 132150, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), 'code': u'CLI_E', 'name': u'Climber, Evergreen'}, {'_created': datetime.datetime(2011, 10, 18, 14, 45, 11, 131138, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), '_last_updated': datetime.datetime(2011, 10, 18, 14, 45, 11, 132150, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), 'code': u'EPI', 'name': u'Epiphyte'}, {'_created': datetime.datetime(2011, 10, 18, 14, 45, 11, 131138, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), '_last_updated': datetime.datetime(2011, 10, 18, 14, 45, 11, 132150, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), 'code': u'FER', 'name': u'Fern'}, {'_created': datetime.datetime(2011, 10, 18, 14, 45, 11, 131138, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), '_last_updated': datetime.datetime(2011, 10, 18, 14, 45, 11, 132150, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), 'code': u'GRASS', 'name': u'Grass'}, {'_created': datetime.datetime(2011, 10, 18, 14, 45, 11, 131138, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), '_last_updated': datetime.datetime(2011, 10, 18, 14, 45, 11, 132150, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), 'code': u'GCV_D', 'name': u'Ground Cover, Deciduous'} ... displaying 10 of 37 total bound parameter sets ... {'_created': datetime.datetime(2011, 10, 18, 14, 45, 11, 131138, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), '_last_updated': datetime.datetime(2011, 10, 18, 14, 45, 11, 132150, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), 'code': u'VIN', 'name': u'Vine'}, {'_created': datetime.datetime(2011, 10, 18, 14, 45, 11, 131138, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), '_last_updated': datetime.datetime(2011, 10, 18, 14, 45, 11, 132150, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=1200, name=None)), 'code': u'WET', 'name': u'Wetland Plant'})

Comments (3)

  1. Mike Bayer repo owner

    there's no test case attached here so I cannot reproduce. A simple script obviously works as this is an extremely basic SQLAlchemy function:

    e = create_engine("postgresql://scott:tiger@localhost/test", echo=True)
    t = Table('t', MetaData(e),
        Column('id', Integer, Sequence('table_id_seq'), primary_key=True) ,
        Column('code', String(50))
    )
    t.drop(checkfirst=True)
    t.create(e)
    
    i = t.insert()
    e.execute(i, [{'code':'c2'}, {'code':'c3'}]({'code':'c1'},))
    

    please reopen once you can provide more specifics, thanks.

  2. Mike Bayer repo owner

    here's that test case:

    from sqlalchemy import *
    
    e = create_engine("postgresql://scott:tiger@localhost/test", echo=True)
    t = Table('t', MetaData(e),
        Column('id', Integer, Sequence('table_id_seq'), primary_key=True) ,
        Column('code', String(50))
    )
    t.drop(checkfirst=True)
    t.create(e)
    
    i = t.insert()
    e.execute(i, [{'code':'c2'}, {'code':'c3'}]({'code':'c1'},))
    
  3. Mike Bayer repo owner

    and some output...

    2011-10-18 15:15:18,635 INFO sqlalchemy.engine.base.Engine select version()
    2011-10-18 15:15:18,635 INFO sqlalchemy.engine.base.Engine {}
    2011-10-18 15:15:18,636 INFO sqlalchemy.engine.base.Engine select current_schema()
    2011-10-18 15:15:18,636 INFO sqlalchemy.engine.base.Engine {}
    2011-10-18 15:15:18,638 INFO sqlalchemy.engine.base.Engine select relname from pg_class c join pg_namespace n on n.oid=c.relnamespace where n.nspname=current_schema() and relname=%(name)s
    2011-10-18 15:15:18,638 INFO sqlalchemy.engine.base.Engine {'name': u't'}
    2011-10-18 15:15:18,640 INFO sqlalchemy.engine.base.Engine SELECT relname FROM pg_class c join pg_namespace n on n.oid=c.relnamespace where relkind='S' and n.nspname=current_schema() and relname=%(name)s
    2011-10-18 15:15:18,640 INFO sqlalchemy.engine.base.Engine {'name': u'table_id_seq'}
    2011-10-18 15:15:18,641 INFO sqlalchemy.engine.base.Engine DROP SEQUENCE table_id_seq
    2011-10-18 15:15:18,641 INFO sqlalchemy.engine.base.Engine {}
    2011-10-18 15:15:18,642 INFO sqlalchemy.engine.base.Engine COMMIT
    2011-10-18 15:15:18,643 INFO sqlalchemy.engine.base.Engine 
    DROP TABLE t
    2011-10-18 15:15:18,643 INFO sqlalchemy.engine.base.Engine {}
    2011-10-18 15:15:18,644 INFO sqlalchemy.engine.base.Engine COMMIT
    2011-10-18 15:15:18,645 INFO sqlalchemy.engine.base.Engine CREATE SEQUENCE table_id_seq
    2011-10-18 15:15:18,645 INFO sqlalchemy.engine.base.Engine {}
    2011-10-18 15:15:18,646 INFO sqlalchemy.engine.base.Engine COMMIT
    2011-10-18 15:15:18,647 INFO sqlalchemy.engine.base.Engine 
    CREATE TABLE t (
        id INTEGER NOT NULL, 
        code VARCHAR(50), 
        PRIMARY KEY (id)
    )
    
    
    2011-10-18 15:15:18,647 INFO sqlalchemy.engine.base.Engine {}
    2011-10-18 15:15:18,649 INFO sqlalchemy.engine.base.Engine COMMIT
    2011-10-18 15:15:18,650 INFO sqlalchemy.engine.base.Engine INSERT INTO t (id, code) VALUES (nextval('table_id_seq'), %(code)s)
    2011-10-18 15:15:18,650 INFO sqlalchemy.engine.base.Engine ({'code': 'c1'}, {'code': 'c2'}, {'code': 'c3'})
    2011-10-18 15:15:18,651 INFO sqlalchemy.engine.base.Engine COMMIT
    
  4. Log in to comment