Unter der Annahme dieses MySQL Tabellenschema:SQLAlchemy berichtet "Invalid utf8mb4 Zeichenfolge" für Binärspalte
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uuid` binary(16) NOT NULL,
`email` varchar(255) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`photo` binary(16) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uuid` (`uuid`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4;
Wenn ich die execute()
API von SQLAlchemy Verbindungsklasse als solche:
with self.engine.begin() as connection:
user_uuid = uuid.UUID("...")
result = connection.execute("SELECT email, name, photo FROM user WHERE uuid=%s", user_uuid.bytes)
Wenn die UUID ist F393A167-A919-4B50-BBB7-4AD356E89E6B
, dann druckt SQLAlchemy diese Warnung:
/site-packages/sqlalchemy/engine/def ault.py:450: Warnung: Ungültige utf8mb4 Zeichenfolge: ‚F393A1‘
Die uuid
Spalte ist eine BINARY
Spalte, also warum erwägt SQLAlchemy diesen Parametern einen Text ein, anstatt eine binäre Eins und wie dies zu verhindern ?
Sie haben wahrscheinlich recht mit dem Python 2 'str' vs' unicode' Problem. Wenn Sie die von SQLAlchemy Core ausgegebenen SQL-Befehle protokollieren, was wird verwendet? – Pol
Es verwendet 'Bytearray' auf Python 2 und 'Bytes' auf Python 3. – RazerM
Ich meine, was ist das eigentliche SQL von SQLAlchemy Core generiert und an den MySQL-Treiber (es ist sichtbar, indem Sie echo = True auf der Engine)? – Pol