Exemple #1
0
        def go():
            # execute with explicit id
            r = table.insert().execute({'id': 30, 'data': 'd1'})
            assert r.last_inserted_ids() == [30]

            # execute with prefetch id
            r = table.insert().execute({'data': 'd2'})
            assert r.last_inserted_ids() == [1]

            # executemany with explicit ids
            table.insert().execute({
                'id': 31,
                'data': 'd3'
            }, {
                'id': 32,
                'data': 'd4'
            })

            # executemany, uses SERIAL
            table.insert().execute({'data': 'd5'}, {'data': 'd6'})

            # single execute, explicit id, inline
            table.insert(inline=True).execute({'id': 33, 'data': 'd7'})

            # single execute, inline, uses SERIAL
            table.insert(inline=True).execute({'data': 'd8'})
Exemple #2
0
    def test_insertid_reserved(self):
        meta = self.metadata
        table = Table("select", meta, Column("col", Integer, primary_key=True))
        table.create()

        table.insert().execute(col=7)
        eq_(table.select().scalar(), 7)
Exemple #3
0
    def test_insert_returning(self):
        meta = MetaData(testing.db)
        table = Table('tables', meta,
            Column('id', Integer, Sequence('gen_tables_id'), primary_key=True),
            Column('persons', Integer),
            Column('full', Boolean)
        )
        table.create()
        try:
            result = table.insert(firebird_returning=[table.c.id]).execute({'persons': 1, 'full': False})

            eq_(result.fetchall(), [(1,)])

            # Multiple inserts only return the last row
            result2 = table.insert(firebird_returning=[table]).execute(
                 [{'persons': 2, 'full': False}, {'persons': 3, 'full': True}])

            eq_(result2.fetchall(), [(3,3,True)])

            result3 = table.insert(firebird_returning=[table.c.id]).execute({'persons': 4, 'full': False})
            eq_([dict(row) for row in result3], [{'ID':4}])

            result4 = testing.db.execute('insert into tables (id, persons, "full") values (5, 10, 1) returning persons')
            eq_([dict(row) for row in result4], [{'PERSONS': 10}])
        finally:
            table.drop()
Exemple #4
0
    def test_insert_returning(self):
        meta = MetaData(testing.db)
        table = Table('tables', meta,
            Column('id', Integer, primary_key=True),
            Column('persons', Integer),
            Column('full', Boolean)
        )
        table.create()
        try:
            result = table.insert(postgres_returning=[table.c.id]).execute({'persons': 1, 'full': False})

            eq_(result.fetchall(), [(1,)])

            @testing.fails_on('postgres', 'Known limitation of psycopg2')
            def test_executemany():
                # return value is documented as failing with psycopg2/executemany
                result2 = table.insert(postgres_returning=[table]).execute(
                     [{'persons': 2, 'full': False}, {'persons': 3, 'full': True}])
                eq_(result2.fetchall(), [(2, 2, False), (3,3,True)])
            
            test_executemany()
            
            result3 = table.insert(postgres_returning=[(table.c.id*2).label('double_id')]).execute({'persons': 4, 'full': False})
            eq_([dict(row) for row in result3], [{'double_id':8}])

            result4 = testing.db.execute('insert into tables (id, persons, "full") values (5, 10, true) returning persons')
            eq_([dict(row) for row in result4], [{'persons': 10}])
        finally:
            table.drop()
Exemple #5
0
 def _assert_data_noautoincrement(self, table):
     table.insert().execute({'id':30, 'data':'d1'})
     try:
         table.insert().execute({'data':'d2'})
         assert False
     except exc.IntegrityError, e:
         assert "violates not-null constraint" in str(e)
Exemple #6
0
 def _assert_data_noautoincrement(self, table):
     table.insert().execute({'id': 30, 'data': 'd1'})
     try:
         table.insert().execute({'data': 'd2'})
         assert False
     except exc.IntegrityError, e:
         assert "violates not-null constraint" in str(e)
Exemple #7
0
    def test_insertid_reserved(self):
        meta = self.metadata
        table = Table("select", meta, Column("col", Integer, primary_key=True))
        table.create()

        table.insert().execute(col=7)
        eq_(table.select().scalar(), 7)
Exemple #8
0
    def test_table_round_trip(self):
        oracle.RESERVED_WORDS.remove('UNION')

        metadata = self.metadata
        table = Table("t1", metadata,
                      Column("option", Integer),
                      Column("plain", Integer, quote=True),
                      # test that quote works for a reserved word
                      # that the dialect isn't aware of when quote
                      # is set
                      Column("union", Integer, quote=True))
        metadata.create_all()

        table.insert().execute(
            {"option": 1, "plain": 1, "union": 1}
        )
        eq_(
            testing.db.execute(table.select()).first(),
            (1, 1, 1)
        )
        table.update().values(option=2, plain=2, union=2).execute()
        eq_(
            testing.db.execute(table.select()).first(),
            (2, 2, 2)
        )
Exemple #9
0
    def test_insert_returning(self):
        meta = MetaData(testing.db)
        table = Table('tables', meta,
            Column('id', Integer, primary_key=True),
            Column('persons', Integer),
            Column('full', Boolean)
        )
        table.create()
        try:
            result = table.insert(postgres_returning=[table.c.id]).execute({'persons': 1, 'full': False})

            self.assertEqual(result.fetchall(), [(1,)])

            # Multiple inserts only return the last row
            result2 = table.insert(postgres_returning=[table]).execute(
                 [{'persons': 2, 'full': False}, {'persons': 3, 'full': True}])
            self.assertEqual(result2.fetchall(), [(3,3,True)])

            result3 = table.insert(postgres_returning=[(table.c.id*2).label('double_id')]).execute({'persons': 4, 'full': False})
            self.assertEqual([dict(row) for row in result3], [{'double_id':8}])

            result4 = testing.db.execute('insert into tables (id, persons, "full") values (5, 10, true) returning persons')
            self.assertEqual([dict(row) for row in result4], [{'persons': 10}])
        finally:
            table.drop()
Exemple #10
0
    def test_delete_returning(self):
        meta = MetaData(testing.db)
        table = Table(
            'tables', meta,
            Column('id', Integer, Sequence('gen_tables_id'), primary_key=True),
            Column('persons', Integer), Column('full', Boolean))
        table.create()
        try:
            table.insert().execute([{
                'persons': 5,
                'full': False
            }, {
                'persons': 3,
                'full': False
            }])

            result = table.delete(table.c.persons > 4,
                                  firebird_returning=[table.c.id]).execute()
            self.assertEqual(result.fetchall(), [(1, )])

            result2 = select([table.c.id,
                              table.c.full]).order_by(table.c.id).execute()
            self.assertEqual(result2.fetchall(), [
                (2, False),
            ])
        finally:
            table.drop()
Exemple #11
0
    def test_insertid_reserved(self):
        meta = MetaData(testing.db)
        table = Table('select', meta, Column('col', Integer, primary_key=True))
        table.create()

        meta2 = MetaData(testing.db)
        try:
            table.insert().execute(col=7)
        finally:
            table.drop()
Exemple #12
0
    def test_quoted_column_unicode(self):
        metadata = self.metadata
        table = Table("atable", metadata,
                      Column(u("méil"), Unicode(255), primary_key=True))
        metadata.create_all()

        table.insert().execute({u('méil'): u('’é')}, )
        result = testing.db.execute(
            table.select().where(table.c[u('méil')] == u('’é'))).scalar()
        eq_(result, u('’é'))
Exemple #13
0
    def test_quoted_column_non_unicode(self):
        metadata = self.metadata
        table = Table(
            "atable", metadata,
            Column("_underscorecolumn", Unicode(255), primary_key=True))
        metadata.create_all()

        table.insert().execute({'_underscorecolumn': u('’é')}, )
        result = testing.db.execute(table.select().where(
            table.c._underscorecolumn == u('’é'))).scalar()
        eq_(result, u('’é'))
Exemple #14
0
    def test_quoted_column_unicode(self):
        metadata = self.metadata
        table = Table("atable", metadata,
                      Column(u("méil"), Unicode(255), primary_key=True))
        metadata.create_all()

        table.insert().execute(
            {u('méil'): u('’é')},
        )
        result = testing.db.execute(
            table.select().where(table.c[u('méil')] == u('’é'))
        ).scalar()
        eq_(result, u('’é'))
Exemple #15
0
    def test_insertid_reserved(self):
        meta = MetaData(testing.db)
        table = Table(
            'select', meta,
            Column('col', Integer, primary_key=True)
        )
        table.create()

        meta2 = MetaData(testing.db)
        try:
            table.insert().execute(col=7)
        finally:
            table.drop()
Exemple #16
0
    def test_insert_returning(self):
        meta = MetaData(testing.db)
        table = Table('tables', meta, Column('id', Integer, primary_key=True),
                      Column('persons', Integer), Column('full', Boolean))
        table.create()
        try:
            result = table.insert(postgres_returning=[table.c.id]).execute({
                'persons':
                1,
                'full':
                False
            })

            eq_(result.fetchall(), [(1, )])

            @testing.fails_on('postgres', 'Known limitation of psycopg2')
            def test_executemany():
                # return value is documented as failing with psycopg2/executemany
                result2 = table.insert(postgres_returning=[table]).execute([{
                    'persons':
                    2,
                    'full':
                    False
                }, {
                    'persons':
                    3,
                    'full':
                    True
                }])
                eq_(result2.fetchall(), [(2, 2, False), (3, 3, True)])

            test_executemany()

            result3 = table.insert(
                postgres_returning=[(table.c.id *
                                     2).label('double_id')]).execute({
                                         'persons':
                                         4,
                                         'full':
                                         False
                                     })
            eq_([dict(row) for row in result3], [{'double_id': 8}])

            result4 = testing.db.execute(
                'insert into tables (id, persons, "full") values (5, 10, true) returning persons'
            )
            eq_([dict(row) for row in result4], [{'persons': 10}])
        finally:
            table.drop()
Exemple #17
0
    def test_quoted_column_non_unicode(self):
        metadata = self.metadata
        table = Table("atable", metadata,
                      Column("_underscorecolumn",
                             Unicode(255),
                             primary_key=True))
        metadata.create_all()

        table.insert().execute(
            {'_underscorecolumn': u('’é')},
        )
        result = testing.db.execute(
            table.select().where(table.c._underscorecolumn == u('’é'))
        ).scalar()
        eq_(result, u('’é'))
Exemple #18
0
    def test_insertid_reserved(self, connection):
        meta = self.metadata
        table = Table("select", meta, Column("col", Integer, primary_key=True))
        table.create(connection)

        connection.execute(table.insert(), {"col": 7})
        eq_(connection.scalar(table.select()), 7)
Exemple #19
0
    def test_insert_returning(self):
        meta = MetaData(testing.db)
        table = Table('tables', meta, Column('id', Integer, primary_key=True),
                      Column('persons', Integer), Column('full', Boolean))
        table.create()
        try:
            result = table.insert(postgres_returning=[table.c.id]).execute({
                'persons':
                1,
                'full':
                False
            })

            self.assertEqual(result.fetchall(), [(1, )])

            # Multiple inserts only return the last row
            result2 = table.insert(postgres_returning=[table]).execute([{
                'persons':
                2,
                'full':
                False
            }, {
                'persons':
                3,
                'full':
                True
            }])
            self.assertEqual(result2.fetchall(), [(3, 3, True)])

            result3 = table.insert(
                postgres_returning=[(table.c.id *
                                     2).label('double_id')]).execute({
                                         'persons':
                                         4,
                                         'full':
                                         False
                                     })
            self.assertEqual([dict(row) for row in result3], [{
                'double_id': 8
            }])

            result4 = testing.db.execute(
                'insert into tables (id, persons, "full") values (5, 10, true) returning persons'
            )
            self.assertEqual([dict(row) for row in result4], [{'persons': 10}])
        finally:
            table.drop()
Exemple #20
0
    def test_insert_returning(self):
        meta = MetaData(testing.db)
        table = Table(
            'tables', meta,
            Column('id', Integer, Sequence('gen_tables_id'), primary_key=True),
            Column('persons', Integer), Column('full', Boolean))
        table.create()
        try:
            result = table.insert(firebird_returning=[table.c.id]).execute({
                'persons':
                1,
                'full':
                False
            })

            eq_(result.fetchall(), [(1, )])

            # Multiple inserts only return the last row
            result2 = table.insert(firebird_returning=[table]).execute([{
                'persons':
                2,
                'full':
                False
            }, {
                'persons':
                3,
                'full':
                True
            }])

            eq_(result2.fetchall(), [(3, 3, True)])

            result3 = table.insert(firebird_returning=[table.c.id]).execute({
                'persons':
                4,
                'full':
                False
            })
            eq_([dict(row) for row in result3], [{'ID': 4}])

            result4 = testing.db.execute(
                'insert into tables (id, persons, "full") values (5, 10, 1) returning persons'
            )
            eq_([dict(row) for row in result4], [{'PERSONS': 10}])
        finally:
            table.drop()
Exemple #21
0
    def test_update_returning(self):
        meta = MetaData(testing.db)
        table = Table('tables', meta,
            Column('id', Integer, primary_key=True),
            Column('persons', Integer),
            Column('full', Boolean)
        )
        table.create()
        try:
            table.insert().execute([{'persons': 5, 'full': False}, {'persons': 3, 'full': False}])

            result = table.update(table.c.persons > 4, dict(full=True), postgres_returning=[table.c.id]).execute()
            self.assertEqual(result.fetchall(), [(1,)])

            result2 = select([table.c.id, table.c.full]).order_by(table.c.id).execute()
            self.assertEqual(result2.fetchall(), [(1,True),(2,False)])
        finally:
            table.drop()
Exemple #22
0
    def test_delete_returning(self):
        meta = MetaData(testing.db)
        table = Table('tables', meta,
            Column('id', Integer, Sequence('gen_tables_id'), primary_key=True),
            Column('persons', Integer),
            Column('full', Boolean)
        )
        table.create()
        try:
            table.insert().execute([{'persons': 5, 'full': False}, {'persons': 3, 'full': False}])

            result = table.delete(table.c.persons > 4, firebird_returning=[table.c.id]).execute()
            eq_(result.fetchall(), [(1,)])

            result2 = select([table.c.id, table.c.full]).order_by(table.c.id).execute()
            eq_(result2.fetchall(), [(2,False),])
        finally:
            table.drop()
 def test_extract_expression(self):
     meta = MetaData(testing.db)
     table = Table('test', meta,
                   Column('dt', DateTime),
                   Column('d', Date))
     meta.create_all()
     try:
         table.insert().execute(
             {'dt': datetime.datetime(2010, 5, 1, 12, 11, 10),
              'd': datetime.date(2010, 5, 1)})
         rs = select([extract('year', table.c.dt),
                      extract('month', table.c.d)]).execute()
         row = rs.first()
         assert row[0] == 2010
         assert row[1] == 5
         rs.close()
     finally:
         meta.drop_all()
 def test_returning_no_autoinc(self):
     meta = self.metadata
     table = Table('t1', meta, Column('id', Integer, primary_key=True),
                   Column('data', String(50)))
     table.create()
     result = table.insert().values(
         id=1,
         data=func.lower('SomeString')).\
         returning(table.c.id, table.c.data).execute()
     eq_(result.fetchall(), [(1, 'somestring')])
Exemple #25
0
def initiateLinkSearch(link):
    table = Table(tableHtml, metadata, autoload=True)
    s = engine.execute(table.select().where(table.columns.linkValue == link))
    links = s.fetchall()
    if (len(links) == 0):
        insertedHtml = engine.execute(
            table.insert().values(linkValue=link)).inserted_primary_key[0]
    else:
        insertedHtml = links[0].id
    return insertedHtml, link
Exemple #26
0
    def test_compiled_insert(self):
        table = Table('testtable', metadata,
            Column('id', Integer, primary_key=True),
            Column('data', String(30)))

        metadata.create_all()

        ins = table.insert(values={'data':bindparam('x')}).compile()
        ins.execute({'x':"five"}, {'x':"seven"})
        assert table.select().execute().fetchall() == [(1, 'five'), (2, 'seven')]
Exemple #27
0
 def test_extract_expression(self):
     meta = MetaData(testing.db)
     table = Table("test", meta, Column("dt", DateTime), Column("d", Date))
     meta.create_all()
     try:
         table.insert().execute({
             "dt":
             datetime.datetime(2010, 5, 1, 12, 11, 10),
             "d":
             datetime.date(2010, 5, 1),
         })
         rs = select(
             [extract("year", table.c.dt),
              extract("month", table.c.d)]).execute()
         row = rs.first()
         assert row[0] == 2010
         assert row[1] == 5
         rs.close()
     finally:
         meta.drop_all()
 def test_extract_expression(self):
     meta = MetaData(testing.db)
     table = Table("test", meta, Column("dt", DateTime), Column("d", Date))
     meta.create_all()
     try:
         table.insert().execute(
             {
                 "dt": datetime.datetime(2010, 5, 1, 12, 11, 10),
                 "d": datetime.date(2010, 5, 1),
             }
         )
         rs = select(
             [extract("year", table.c.dt), extract("month", table.c.d)]
         ).execute()
         row = rs.first()
         assert row[0] == 2010
         assert row[1] == 5
         rs.close()
     finally:
         meta.drop_all()
Exemple #29
0
        def go():
            # execute with explicit id
            r = table.insert().execute({'id':30, 'data':'d1'})
            assert r.last_inserted_ids() == [30]

            # execute with prefetch id
            r = table.insert().execute({'data':'d2'})
            assert r.last_inserted_ids() == [1]

            # executemany with explicit ids
            table.insert().execute({'id':31, 'data':'d3'}, {'id':32, 'data':'d4'})

            # executemany, uses SERIAL
            table.insert().execute({'data':'d5'}, {'data':'d6'})

            # single execute, explicit id, inline
            table.insert(inline=True).execute({'id':33, 'data':'d7'})

            # single execute, inline, uses SERIAL
            table.insert(inline=True).execute({'data':'d8'})
Exemple #30
0
    def test_compiled_insert(self):
        table = Table('testtable', metadata,
                      Column('id', Integer, primary_key=True),
                      Column('data', String(30)))

        metadata.create_all()

        ins = table.insert(values={'data': bindparam('x')}).compile()
        ins.execute({'x': "five"}, {'x': "seven"})
        assert table.select().execute().fetchall() == [(1, 'five'),
                                                       (2, 'seven')]
 def test_returning_no_autoinc(self):
     meta = self.metadata
     table = Table(
         't1', meta,
         Column('id', Integer, primary_key=True),
         Column('data', String(50)))
     table.create()
     result = table.insert().values(
         id=1,
         data=func.lower('SomeString')).\
         returning(table.c.id, table.c.data).execute()
     eq_(result.fetchall(), [(1, 'somestring')])
Exemple #32
0
 def test_returning_no_autoinc(self, connection):
     meta = self.metadata
     table = Table(
         "t1",
         meta,
         Column("id", Integer, primary_key=True),
         Column("data", String(50)),
     )
     table.create(connection)
     result = connection.execute(table.insert().values(
         id=1,
         data=func.lower("SomeString")).returning(table.c.id, table.c.data))
     eq_(result.fetchall(), [(1, "somestring")])
Exemple #33
0
 def test_executemany():
     # return value is documented as failing with psycopg2/executemany
     result2 = table.insert(postgres_returning=[table]).execute([{
         'persons':
         2,
         'full':
         False
     }, {
         'persons':
         3,
         'full':
         True
     }])
     eq_(result2.fetchall(), [(2, 2, False), (3, 3, True)])
Exemple #34
0
    def test_update_returning(self):
        meta = MetaData(testing.db)
        table = Table('tables', meta, Column('id', Integer, primary_key=True),
                      Column('persons', Integer), Column('full', Boolean))
        table.create()
        try:
            table.insert().execute([{
                'persons': 5,
                'full': False
            }, {
                'persons': 3,
                'full': False
            }])

            result = table.update(table.c.persons > 4,
                                  dict(full=True),
                                  postgres_returning=[table.c.id]).execute()
            eq_(result.fetchall(), [(1, )])

            result2 = select([table.c.id,
                              table.c.full]).order_by(table.c.id).execute()
            eq_(result2.fetchall(), [(1, True), (2, False)])
        finally:
            table.drop()
Exemple #35
0
    def test_returning_no_autoinc(self):
        meta = MetaData(testing.db)
        table = Table('t1', meta, Column('id', Integer, primary_key=True),
                      Column('data', String(50)))
        table.create()
        try:
            result = table.insert().values(
                id=1, data=func.lower('SomeString')).returning(
                    table.c.id, table.c.data).execute()
            eq_(result.fetchall(), [(1, 'somestring')])
        finally:

            # this will hang if the "SET IDENTITY_INSERT t1 OFF" occurs
            # before the result is fetched

            table.drop()
Exemple #36
0
    def test_returning_no_autoinc(self):
        meta = MetaData(testing.db)
        table = Table('t1', meta, Column('id', Integer,
                      primary_key=True), Column('data', String(50)))
        table.create()
        try:
            result = table.insert().values(id=1,
                    data=func.lower('SomeString'
                    )).returning(table.c.id, table.c.data).execute()
            eq_(result.fetchall(), [(1, 'somestring')])
        finally:

            # this will hang if the "SET IDENTITY_INSERT t1 OFF" occurs
            # before the result is fetched

            table.drop()
Exemple #37
0
 def test_returning_no_autoinc(self):
     meta = self.metadata
     table = Table(
         "t1",
         meta,
         Column("id", Integer, primary_key=True),
         Column("data", String(50)),
     )
     table.create()
     result = (
         table.insert()
         .values(id=1, data=func.lower("SomeString"))
         .returning(table.c.id, table.c.data)
         .execute()
     )
     eq_(result.fetchall(), [(1, "somestring")])
Exemple #38
0
 def test_extract_expression(self, connection):
     meta = self.metadata
     table = Table("test", meta, Column("dt", DateTime), Column("d", Date))
     meta.create_all(connection)
     connection.execute(
         table.insert(),
         {
             "dt": datetime.datetime(2010, 5, 1, 12, 11, 10),
             "d": datetime.date(2010, 5, 1),
         },
     )
     rs = connection.execute(
         select(extract("year", table.c.dt), extract("month", table.c.d)))
     row = rs.first()
     assert row[0] == 2010
     assert row[1] == 5
     rs.close()
Exemple #39
0
 def go():
     table.insert().execute({'id':30, 'data':'d1'})
     table.insert().execute({'data':'d2'})
     table.insert().execute({'id':31, 'data':'d3'}, {'id':32, 'data':'d4'})
     table.insert().execute({'data':'d5'}, {'data':'d6'})
     table.insert(inline=True).execute({'id':33, 'data':'d7'})
     table.insert(inline=True).execute({'data':'d8'})
Exemple #40
0
 def go():
     table.insert().execute({'id': 30, 'data': 'd1'})
     table.insert().execute({'data': 'd2'})
     table.insert().execute({
         'id': 31,
         'data': 'd3'
     }, {
         'id': 32,
         'data': 'd4'
     })
     table.insert().execute({'data': 'd5'}, {'data': 'd6'})
     table.insert(inline=True).execute({'id': 33, 'data': 'd7'})
     table.insert(inline=True).execute({'data': 'd8'})
Exemple #41
0
 def test_executemany():
     # return value is documented as failing with psycopg2/executemany
     result2 = table.insert(postgres_returning=[table]).execute(
          [{'persons': 2, 'full': False}, {'persons': 3, 'full': True}])
     eq_(result2.fetchall(), [(2, 2, False), (3,3,True)])
Exemple #42
0
 def go():
     table.insert().execute({'id': 30, 'data': 'd1'})
     r = table.insert().execute({'data': 'd2'})
     assert r.last_inserted_ids() == [5]
     table.insert().execute({
         'id': 31,
         'data': 'd3'
     }, {
         'id': 32,
         'data': 'd4'
     })
     table.insert().execute({'data': 'd5'}, {'data': 'd6'})
     table.insert(inline=True).execute({'id': 33, 'data': 'd7'})
     table.insert(inline=True).execute({'data': 'd8'})
Exemple #43
0
class InsertTest(TestBase, AssertsExecutionResults):
    __only_on__ = 'postgres'

    def setUpAll(self):
        global metadata
        metadata = MetaData(testing.db)

    def tearDown(self):
        metadata.drop_all()
        metadata.tables.clear()

    def test_compiled_insert(self):
        table = Table('testtable', metadata,
                      Column('id', Integer, primary_key=True),
                      Column('data', String(30)))

        metadata.create_all()

        ins = table.insert(values={'data': bindparam('x')}).compile()
        ins.execute({'x': "five"}, {'x': "seven"})
        assert table.select().execute().fetchall() == [(1, 'five'),
                                                       (2, 'seven')]

    def test_sequence_insert(self):
        table = Table(
            'testtable', metadata,
            Column('id', Integer, Sequence('my_seq'), primary_key=True),
            Column('data', String(30)))
        metadata.create_all()
        self._assert_data_with_sequence(table, "my_seq")

    def test_opt_sequence_insert(self):
        table = Table(
            'testtable', metadata,
            Column('id',
                   Integer,
                   Sequence('my_seq', optional=True),
                   primary_key=True), Column('data', String(30)))
        metadata.create_all()
        self._assert_data_autoincrement(table)

    def test_autoincrement_insert(self):
        table = Table('testtable', metadata,
                      Column('id', Integer, primary_key=True),
                      Column('data', String(30)))
        metadata.create_all()
        self._assert_data_autoincrement(table)

    def test_noautoincrement_insert(self):
        table = Table(
            'testtable', metadata,
            Column('id', Integer, primary_key=True, autoincrement=False),
            Column('data', String(30)))
        metadata.create_all()
        self._assert_data_noautoincrement(table)

    def _assert_data_autoincrement(self, table):
        def go():
            # execute with explicit id
            r = table.insert().execute({'id': 30, 'data': 'd1'})
            assert r.last_inserted_ids() == [30]

            # execute with prefetch id
            r = table.insert().execute({'data': 'd2'})
            assert r.last_inserted_ids() == [1]

            # executemany with explicit ids
            table.insert().execute({
                'id': 31,
                'data': 'd3'
            }, {
                'id': 32,
                'data': 'd4'
            })

            # executemany, uses SERIAL
            table.insert().execute({'data': 'd5'}, {'data': 'd6'})

            # single execute, explicit id, inline
            table.insert(inline=True).execute({'id': 33, 'data': 'd7'})

            # single execute, inline, uses SERIAL
            table.insert(inline=True).execute({'data': 'd8'})

        # note that the test framework doesnt capture the "preexecute" of a seqeuence
        # or default.  we just see it in the bind params.

        self.assert_sql(
            testing.db,
            go, [],
            with_sequences=[
                ("INSERT INTO testtable (id, data) VALUES (:id, :data)", {
                    'id': 30,
                    'data': 'd1'
                }),
                ("INSERT INTO testtable (id, data) VALUES (:id, :data)", {
                    'id': 1,
                    'data': 'd2'
                }),
                ("INSERT INTO testtable (id, data) VALUES (:id, :data)", [{
                    'id':
                    31,
                    'data':
                    'd3'
                }, {
                    'id':
                    32,
                    'data':
                    'd4'
                }]),
                ("INSERT INTO testtable (data) VALUES (:data)", [{
                    'data': 'd5'
                }, {
                    'data': 'd6'
                }]),
                ("INSERT INTO testtable (id, data) VALUES (:id, :data)", [{
                    'id':
                    33,
                    'data':
                    'd7'
                }]),
                ("INSERT INTO testtable (data) VALUES (:data)", [{
                    'data': 'd8'
                }]),
            ])

        assert table.select().execute().fetchall() == [
            (30, 'd1'),
            (1, 'd2'),
            (31, 'd3'),
            (32, 'd4'),
            (2, 'd5'),
            (3, 'd6'),
            (33, 'd7'),
            (4, 'd8'),
        ]
        table.delete().execute()

        # test the same series of events using a reflected
        # version of the table
        m2 = MetaData(testing.db)
        table = Table(table.name, m2, autoload=True)

        def go():
            table.insert().execute({'id': 30, 'data': 'd1'})
            r = table.insert().execute({'data': 'd2'})
            assert r.last_inserted_ids() == [5]
            table.insert().execute({
                'id': 31,
                'data': 'd3'
            }, {
                'id': 32,
                'data': 'd4'
            })
            table.insert().execute({'data': 'd5'}, {'data': 'd6'})
            table.insert(inline=True).execute({'id': 33, 'data': 'd7'})
            table.insert(inline=True).execute({'data': 'd8'})

        self.assert_sql(
            testing.db,
            go, [],
            with_sequences=[
                ("INSERT INTO testtable (id, data) VALUES (:id, :data)", {
                    'id': 30,
                    'data': 'd1'
                }),
                ("INSERT INTO testtable (id, data) VALUES (:id, :data)", {
                    'id': 5,
                    'data': 'd2'
                }),
                ("INSERT INTO testtable (id, data) VALUES (:id, :data)", [{
                    'id':
                    31,
                    'data':
                    'd3'
                }, {
                    'id':
                    32,
                    'data':
                    'd4'
                }]),
                ("INSERT INTO testtable (data) VALUES (:data)", [{
                    'data': 'd5'
                }, {
                    'data': 'd6'
                }]),
                ("INSERT INTO testtable (id, data) VALUES (:id, :data)", [{
                    'id':
                    33,
                    'data':
                    'd7'
                }]),
                ("INSERT INTO testtable (data) VALUES (:data)", [{
                    'data': 'd8'
                }]),
            ])

        assert table.select().execute().fetchall() == [
            (30, 'd1'),
            (5, 'd2'),
            (31, 'd3'),
            (32, 'd4'),
            (6, 'd5'),
            (7, 'd6'),
            (33, 'd7'),
            (8, 'd8'),
        ]
        table.delete().execute()

    def _assert_data_with_sequence(self, table, seqname):
        def go():
            table.insert().execute({'id': 30, 'data': 'd1'})
            table.insert().execute({'data': 'd2'})
            table.insert().execute({
                'id': 31,
                'data': 'd3'
            }, {
                'id': 32,
                'data': 'd4'
            })
            table.insert().execute({'data': 'd5'}, {'data': 'd6'})
            table.insert(inline=True).execute({'id': 33, 'data': 'd7'})
            table.insert(inline=True).execute({'data': 'd8'})

        self.assert_sql(
            testing.db,
            go, [],
            with_sequences=[
                ("INSERT INTO testtable (id, data) VALUES (:id, :data)", {
                    'id': 30,
                    'data': 'd1'
                }),
                ("INSERT INTO testtable (id, data) VALUES (:id, :data)", {
                    'id': 1,
                    'data': 'd2'
                }),
                ("INSERT INTO testtable (id, data) VALUES (:id, :data)", [{
                    'id':
                    31,
                    'data':
                    'd3'
                }, {
                    'id':
                    32,
                    'data':
                    'd4'
                }]),
                ("INSERT INTO testtable (id, data) VALUES (nextval('%s'), :data)"
                 % seqname, [{
                     'data': 'd5'
                 }, {
                     'data': 'd6'
                 }]),
                ("INSERT INTO testtable (id, data) VALUES (:id, :data)", [{
                    'id':
                    33,
                    'data':
                    'd7'
                }]),
                ("INSERT INTO testtable (id, data) VALUES (nextval('%s'), :data)"
                 % seqname, [{
                     'data': 'd8'
                 }]),
            ])

        assert table.select().execute().fetchall() == [
            (30, 'd1'),
            (1, 'd2'),
            (31, 'd3'),
            (32, 'd4'),
            (2, 'd5'),
            (3, 'd6'),
            (33, 'd7'),
            (4, 'd8'),
        ]

        # cant test reflection here since the Sequence must be
        # explicitly specified

    def _assert_data_noautoincrement(self, table):
        table.insert().execute({'id': 30, 'data': 'd1'})
        try:
            table.insert().execute({'data': 'd2'})
            assert False
        except exc.IntegrityError, e:
            assert "violates not-null constraint" in str(e)
        try:
            table.insert().execute({'data': 'd2'}, {'data': 'd3'})
            assert False
        except exc.IntegrityError, e:
            assert "violates not-null constraint" in str(e)
Exemple #44
0
 def go():
     table.insert().execute({'id':30, 'data':'d1'})
     r = table.insert().execute({'data':'d2'})
     assert r.last_inserted_ids() == [5]
     table.insert().execute({'id':31, 'data':'d3'}, {'id':32, 'data':'d4'})
     table.insert().execute({'data':'d5'}, {'data':'d6'})
     table.insert(inline=True).execute({'id':33, 'data':'d7'})
     table.insert(inline=True).execute({'data':'d8'})