示例#1
0
    def test_unicode_enum(self):
        metadata = self.metadata
        t1 = Table(
            "table",
            metadata,
            Column("id", Integer, primary_key=True),
            Column("value", Enum(u("réveillé"), u("drôle"), u("S’il"))),
            Column("value2", mysql.ENUM(u("réveillé"), u("drôle"), u("S’il"))),
        )
        metadata.create_all()
        t1.insert().execute(value=u("drôle"), value2=u("drôle"))
        t1.insert().execute(value=u("réveillé"), value2=u("réveillé"))
        t1.insert().execute(value=u("S’il"), value2=u("S’il"))
        eq_(
            t1.select().order_by(t1.c.id).execute().fetchall(),
            [
                (1, u("drôle"), u("drôle")),
                (2, u("réveillé"), u("réveillé")),
                (3, u("S’il"), u("S’il")),
            ],
        )

        # test reflection of the enum labels

        m2 = MetaData(testing.db)
        t2 = Table("table", m2, autoload=True)

        # TODO: what's wrong with the last element ?  is there
        # latin-1 stuff forcing its way in ?

        eq_(
            t2.c.value.type.enums[0:2], [u("réveillé"), u("drôle")]
        )  # u'S’il') # eh ?

        eq_(
            t2.c.value2.type.enums[0:2], [u("réveillé"), u("drôle")]
        )  # u'S’il') # eh ?
示例#2
0
    def test_broken_enum_returns_blanks(self, metadata, connection):
        t = Table(
            "enum_missing",
            metadata,
            Column("id", Integer, primary_key=True),
            Column("e1", sqltypes.Enum("one", "two", "three")),
            Column("e2", mysql.ENUM("one", "two", "three")),
        )
        t.create(connection)

        connection.execute(
            t.insert(),
            [
                {
                    "e1": "nonexistent",
                    "e2": "nonexistent"
                },
                {
                    "e1": "",
                    "e2": ""
                },
                {
                    "e1": "two",
                    "e2": "two"
                },
                {
                    "e1": None,
                    "e2": None
                },
            ],
        )

        eq_(
            connection.execute(select(t.c.e1,
                                      t.c.e2).order_by(t.c.id)).fetchall(),
            [("", ""), ("", ""), ("two", "two"), (None, None)],
        )
示例#3
0
    def test_enum_parse(self):

        with testing.expect_deprecated('Manually quoting ENUM value literals'):
            enum_table = Table(
                'mysql_enum', self.metadata, Column('e1', mysql.ENUM("'a'")),
                Column('e2', mysql.ENUM("''")), Column('e3', mysql.ENUM('a')),
                Column('e4', mysql.ENUM('')),
                Column('e5', mysql.ENUM("'a'", "''")),
                Column('e6', mysql.ENUM("''", "'a'")),
                Column('e7', mysql.ENUM("''", "'''a'''", "'b''b'", "''''")))

        for col in enum_table.c:
            self.assert_(repr(col))

        enum_table.create()
        reflected = Table('mysql_enum', MetaData(testing.db), autoload=True)
        for t in enum_table, reflected:
            eq_(t.c.e1.type.enums, ["a"])
            eq_(t.c.e2.type.enums, [""])
            eq_(t.c.e3.type.enums, ["a"])
            eq_(t.c.e4.type.enums, [""])
            eq_(t.c.e5.type.enums, ["a", ""])
            eq_(t.c.e6.type.enums, ["", "a"])
            eq_(t.c.e7.type.enums, ["", "'a'", "b'b", "'"])
示例#4
0
    def test_enum(self, metadata, connection):
        """Exercise the ENUM type."""

        e1 = mysql.ENUM("a", "b")
        e2 = mysql.ENUM("a", "b")
        e3 = mysql.ENUM("a", "b", strict=True)
        e4 = mysql.ENUM("a", "b", strict=True)

        enum_table = Table(
            "mysql_enum",
            metadata,
            Column("e1", e1),
            Column("e2", e2, nullable=False),
            Column(
                "e2generic",
                Enum("a", "b", validate_strings=True),
                nullable=False,
            ),
            Column("e3", e3),
            Column("e4", e4, nullable=False),
            Column("e5", mysql.ENUM("a", "b")),
            Column("e5generic", Enum("a", "b")),
            Column("e6", mysql.ENUM("'a'", "b")),
            Column(
                "e7",
                mysql.ENUM(
                    EnumSetTest.SomeEnum,
                    values_callable=EnumSetTest.get_enum_string_values,
                ),
            ),
            Column("e8", mysql.ENUM(EnumSetTest.SomeEnum)),
        )

        eq_(colspec(enum_table.c.e1), "e1 ENUM('a','b')")
        eq_(colspec(enum_table.c.e2), "e2 ENUM('a','b') NOT NULL")
        eq_(colspec(enum_table.c.e2generic),
            "e2generic ENUM('a','b') NOT NULL")
        eq_(colspec(enum_table.c.e3), "e3 ENUM('a','b')")
        eq_(colspec(enum_table.c.e4), "e4 ENUM('a','b') NOT NULL")
        eq_(colspec(enum_table.c.e5), "e5 ENUM('a','b')")
        eq_(colspec(enum_table.c.e5generic), "e5generic ENUM('a','b')")
        eq_(colspec(enum_table.c.e6), "e6 ENUM('''a''','b')")
        eq_(colspec(enum_table.c.e7), "e7 ENUM('1','2','3','a','b')")
        eq_(
            colspec(enum_table.c.e8),
            "e8 ENUM('one','two','three','AMember','BMember')",
        )
        enum_table.create(connection)

        assert_raises(
            exc.DBAPIError,
            connection.execute,
            enum_table.insert(),
            dict(
                e1=None,
                e2=None,
                e3=None,
                e4=None,
            ),
        )

        assert enum_table.c.e2generic.type.validate_strings

        assert_raises(
            exc.StatementError,
            connection.execute,
            enum_table.insert(),
            dict(
                e1="c",
                e2="c",
                e2generic="c",
                e3="c",
                e4="c",
                e5="c",
                e5generic="c",
                e6="c",
                e7="c",
                e8="c",
            ),
        )

        connection.execute(enum_table.insert())
        connection.execute(
            enum_table.insert(),
            dict(
                e1="a",
                e2="a",
                e2generic="a",
                e3="a",
                e4="a",
                e5="a",
                e5generic="a",
                e6="'a'",
                e7="a",
                e8="AMember",
            ),
        )
        connection.execute(
            enum_table.insert(),
            dict(
                e1="b",
                e2="b",
                e2generic="b",
                e3="b",
                e4="b",
                e5="b",
                e5generic="b",
                e6="b",
                e7="b",
                e8="BMember",
            ),
        )

        res = connection.execute(enum_table.select()).fetchall()

        expected = [
            (None, "a", "a", None, "a", None, None, None, None, None),
            (
                "a",
                "a",
                "a",
                "a",
                "a",
                "a",
                "a",
                "'a'",
                EnumSetTest.SomeEnum.AMember,
                EnumSetTest.SomeEnum.AMember,
            ),
            (
                "b",
                "b",
                "b",
                "b",
                "b",
                "b",
                "b",
                "b",
                EnumSetTest.SomeEnum.BMember,
                EnumSetTest.SomeEnum.BMember,
            ),
        ]

        eq_(res, expected)
示例#5
0
    def test_enum(self):
        """Exercise the ENUM type."""

        with testing.expect_deprecated('Manually quoting ENUM value literals'):
            e1, e2 = mysql.ENUM("'a'", "'b'"), mysql.ENUM("'a'", "'b'")
            e3 = mysql.ENUM("'a'", "'b'", strict=True)
            e4 = mysql.ENUM("'a'", "'b'", strict=True)

        enum_table = Table(
            'mysql_enum',
            self.metadata,
            Column('e1', e1),
            Column('e2', e2, nullable=False),
            Column('e2generic',
                   Enum("a", "b", validate_strings=True),
                   nullable=False),
            Column('e3', e3),
            Column('e4', e4, nullable=False),
            Column('e5', mysql.ENUM("a", "b")),
            Column('e5generic', Enum("a", "b")),
            Column('e6', mysql.ENUM("'a'", "b")),
        )

        eq_(colspec(enum_table.c.e1), "e1 ENUM('a','b')")
        eq_(colspec(enum_table.c.e2), "e2 ENUM('a','b') NOT NULL")
        eq_(colspec(enum_table.c.e2generic),
            "e2generic ENUM('a','b') NOT NULL")
        eq_(colspec(enum_table.c.e3), "e3 ENUM('a','b')")
        eq_(colspec(enum_table.c.e4), "e4 ENUM('a','b') NOT NULL")
        eq_(colspec(enum_table.c.e5), "e5 ENUM('a','b')")
        eq_(colspec(enum_table.c.e5generic), "e5generic ENUM('a','b')")
        eq_(colspec(enum_table.c.e6), "e6 ENUM('''a''','b')")
        enum_table.create()

        assert_raises(exc.DBAPIError,
                      enum_table.insert().execute,
                      e1=None,
                      e2=None,
                      e3=None,
                      e4=None)

        assert_raises(exc.StatementError,
                      enum_table.insert().execute,
                      e1='c',
                      e2='c',
                      e2generic='c',
                      e3='c',
                      e4='c',
                      e5='c',
                      e5generic='c',
                      e6='c')

        enum_table.insert().execute()
        enum_table.insert().execute(e1='a',
                                    e2='a',
                                    e2generic='a',
                                    e3='a',
                                    e4='a',
                                    e5='a',
                                    e5generic='a',
                                    e6="'a'")
        enum_table.insert().execute(e1='b',
                                    e2='b',
                                    e2generic='b',
                                    e3='b',
                                    e4='b',
                                    e5='b',
                                    e5generic='b',
                                    e6='b')

        res = enum_table.select().execute().fetchall()

        expected = [(None, 'a', 'a', None, 'a', None, None, None),
                    ('a', 'a', 'a', 'a', 'a', 'a', 'a', "'a'"),
                    ('b', 'b', 'b', 'b', 'b', 'b', 'b', 'b')]

        eq_(res, expected)
    def test_legacy_enum_types(self):

        specs = [(mysql.ENUM("", "fleem"), mysql.ENUM("", "fleem"))]

        self._run_test(specs, ["enums"])
示例#7
0
    def test_type_reflection(self):
        # (ask_for, roundtripped_as_if_different)
        specs = [(String(1), mysql.MSString(1), ),
                 (String(3), mysql.MSString(3), ),
                 (Text(), mysql.MSText(), ),
                 (Unicode(1), mysql.MSString(1), ),
                 (Unicode(3), mysql.MSString(3), ),
                 (UnicodeText(), mysql.MSText(), ),
                 (mysql.MSChar(1), ),
                 (mysql.MSChar(3), ),
                 (NCHAR(2), mysql.MSChar(2), ),
                 (mysql.MSNChar(2), mysql.MSChar(2), ), # N is CREATE only
                 (mysql.MSNVarChar(22), mysql.MSString(22), ),
                 (SmallInteger(), mysql.MSSmallInteger(), ),
                 (SmallInteger(), mysql.MSSmallInteger(4), ),
                 (mysql.MSSmallInteger(), ),
                 (mysql.MSSmallInteger(4), mysql.MSSmallInteger(4), ),
                 (mysql.MSMediumInteger(), mysql.MSMediumInteger(), ),
                 (mysql.MSMediumInteger(8), mysql.MSMediumInteger(8), ),
                 (LargeBinary(3), mysql.TINYBLOB(), ),
                 (LargeBinary(), mysql.BLOB() ),
                 (mysql.MSBinary(3), mysql.MSBinary(3), ),
                 (mysql.MSVarBinary(3),),
                 (mysql.MSTinyBlob(),),
                 (mysql.MSBlob(),),
                 (mysql.MSBlob(1234), mysql.MSBlob()),
                 (mysql.MSMediumBlob(),),
                 (mysql.MSLongBlob(),),
                 (mysql.ENUM("''","'fleem'"), ),
                 ]

        columns = [Column('c%i' % (i + 1), t[0]) for i, t in enumerate(specs)]

        db = testing.db
        m = MetaData(db)
        t_table = Table('mysql_types', m, *columns)
        try:
            m.create_all()

            m2 = MetaData(db)
            rt = Table('mysql_types', m2, autoload=True)
            try:
                db.execute('CREATE OR REPLACE VIEW mysql_types_v '
                           'AS SELECT * from mysql_types')
                rv = Table('mysql_types_v', m2, autoload=True)

                expected = [len(c) > 1 and c[1] or c[0] for c in specs]

                # Early 5.0 releases seem to report more "general" for columns
                # in a view, e.g. char -> varchar, tinyblob -> mediumblob
                #
                # Not sure exactly which point version has the fix.
                if db.dialect.server_version_info < (5, 0, 11):
                    tables = rt,
                else:
                    tables = rt, rv

                for table in tables:
                    for i, reflected in enumerate(table.c):
                        assert isinstance(reflected.type,
                                type(expected[i])), \
                            'element %d: %r not instance of %r' % (i,
                                reflected.type, type(expected[i]))
            finally:
                db.execute('DROP VIEW mysql_types_v')
        finally:
            m.drop_all()