2017-10-06 6 views
1

J'ai migré une base de données de SQLite3 vers MySQL. La plupart d'entre elle fonctionne bien, mais sur une table je reçois l'erreur suivante lorsque vous essayez d'ajouter une ligne:Trouver la cause d'une erreur TypeError en utilisant Sqlalchemy dans Python 3 pour l'insérer dans MySQL

sqlalchemy.exc.DBAPIError: (pymysql.err.Error) (<class 'TypeError'>, TypeError("a bytes-like object is required, not 'int'",)) [SQL: 'INSERT INTO offers2 (`OfferID`) VALUES (%s)'] [parameters: (999999,)] 

J'ai essayé turation sur l'écho de voir ce qu'il fait et c'est là, il échoue:

2017-10-06 20:24:34,453 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) 
2017-10-06 20:24:34,454 INFO sqlalchemy.engine.base.Engine INSERT INTO offers2 (`OfferID`) VALUES (%s) 
2017-10-06 20:24:34,454 INFO sqlalchemy.engine.base.Engine (999999,) 
2017-10-06 20:24:34,455 INFO sqlalchemy.engine.base.Engine ROLLBACK 

Le OfferID est défini en tant que tel dans le python:

class Offers(Base): 
    __tablename__ = 'offers2' 
    OfferID = Column(Integer(), primary_key=True) 

Le schéma de la table MySQL est:

-- auto-generated definition 
CREATE TABLE offers2 
(
    OfferID INT AUTO_INCREMENT 
    PRIMARY KEY 
); 

Quelqu'un peut-il m'aider à comprendre le problème et comment le retracer?

La table des offres contenait beaucoup plus de colonnes, mais j'ai essayé de la relier à la clé primaire pour voir si je pouvais isoler le problème, mais il reste quand même.

+1

Que se passe-t-il lorsque vous insérez explicitement des valeurs pour d'autres colonnes dans la table mais que la clé primaire OfferID s'incrémente automatiquement? Votre intention est-elle vraiment d'utiliser une valeur générée de l'extérieur pour la clé primaire? –

+1

Don, la requête d'origine n'a pas explicitement entrer une valeur pour l'OfferID - il a été défini sur autoincrement, et il a toujours généré le même problème. Quelque chose que j'aurais dû mentionner; si j'active echo pour afficher la requête, et que je prends la chaîne de requête, je peux l'insérer correctement si je la copie dans la console et l'exécute, mais je dois changer None values ​​en Null. Dans cet esprit, j'ai essayé d'insérer les enregistrements en m'assurant qu'il n'y avait pas de null et l'erreur apparaît toujours, me faisant penser que cela peut être un problème avec pymysql ou sqlalchemy. – pa1983

Répondre

0

Pour ceux qui tombent sur cette question en recherchant la même sortie d'erreur:

Après quelques essais, je trouve que si je me suis tourné sur l'écho pour voir la requête, puis a pris la chaîne d'insertion SQL et avons essayé de l'appliquer dans la console mySQL le code fonctionnerait. Cela m'a amené à la conclusion que le problème devait se situer soit dans SQLAlchemy ou la connexion pymysql que j'utilisais, donc j'ai essayé de passer de pymysql à mySQLdb et j'ai trouvé que la requête fonctionnait comme prévu, et comme cela avait fonctionné précédemment quand je avait la base de données dans SQLite3.