def test_no_embed_in_sql(self): """Using a DefaultGenerator, Sequence, DefaultClause in the columns, where clause of a select, or in the values clause of insert, update, raises an informative error""" t = Table( "some_table", MetaData(), Column("id", Integer), Column("col4", String()), ) for const in ( sa.Sequence("y"), sa.ColumnDefault("y"), sa.DefaultClause("y"), ): assert_raises_message( sa.exc.ArgumentError, "SQL expression object expected, got object of type " "<.* 'list'> instead", t.select, [const], ) assert_raises_message( sa.exc.InvalidRequestError, "cannot be used directly as a column expression.", str, t.insert().values(col4=const), ) assert_raises_message( sa.exc.InvalidRequestError, "cannot be used directly as a column expression.", str, t.update().values(col4=const), )
def test_labels_no_collision_index(self): """test for [ticket:4911] """ t = Table( "foo", MetaData(), Column("id", Integer, index=True), Column("foo_id", Integer), ) self.assert_compile( t.update().where(t.c.id == 5), "UPDATE foo SET id=:id, foo_id=:foo_id WHERE foo.id = :id_1", ) self.assert_compile( t.update().where(t.c.id == bindparam(key=t.c.id._label)), "UPDATE foo SET id=:id, foo_id=:foo_id WHERE foo.id = :foo_id_1", )
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))
def test_bindparam_quote(self): """test that bound parameters take on quoting for reserved words, column names quote flag enabled.""" # note: this is only in cx_oracle at the moment. not sure # what other hypothetical oracle dialects might need self.assert_compile(bindparam("option"), ':"option"') self.assert_compile(bindparam("plain"), ":plain") t = Table("s", MetaData(), Column("plain", Integer, quote=True)) self.assert_compile( t.insert().values(plain=5), 'INSERT INTO s ("plain") VALUES (:"plain")', ) self.assert_compile(t.update().values(plain=5), 'UPDATE s SET "plain"=:"plain"')
def test_returning_update_computed_warning(self): m = MetaData() t1 = Table( "t1", m, Column("id", Integer, primary_key=True), Column("foo", Integer), Column("bar", Integer, Computed("foo + 42")), ) with testing.expect_warnings( "Computed columns don't work with Oracle UPDATE"): self.assert_compile( t1.update().values(id=1, foo=5).returning(t1.c.bar), "UPDATE t1 SET id=:id, foo=:foo RETURNING t1.bar INTO :ret_0", )
def test_inline_defaults(self): m = MetaData() foo = Table("foo", m, Column("id", Integer)) t = Table( "test", m, Column("col1", Integer, onupdate=func.foo(1)), Column( "col2", Integer, onupdate=select([func.coalesce(func.max(foo.c.id))]), ), Column("col3", String(30)), ) self.assert_compile( t.update(inline=True, values={"col3": "foo"}), "UPDATE test SET col1=foo(:foo_1), col2=(SELECT " "coalesce(max(foo.id)) AS coalesce_1 FROM foo), " "col3=:col3", )