2017-10-06 15 views
1

我已将工作数据库从SQLite3迁移到MySQL。大多数的效果很好,但对一个表我在尝试添加一行时,出现以下错误:在Python 3中使用Sqlalchemy插入到MySQL中找到TypeError的原因

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,)] 

我试图回声,看看它在做什么图灵而这正是它失败:

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 

的OFFERID是在Python定义为这样:

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

MySQL的表模式是:

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

任何人都可以帮助我理解问题以及如何追踪它?

这个offer表中包含更多的列,但我试着将它与主键配对,看看我是否可以找出问题,但仍然存在。

+1

当您为表格中的其他列显式插入值而让OfferID主键自动增加时会发生什么?你的意图确实是为主键使用外部生成的值吗? –

+1

不,原来的查询没有明确输入OfferID的值 - 它被设置为自动增量,并且它仍然产生相同的问题。我应该提到的东西;如果我打开回声查看查询,并采取查询字符串我可以得到它插入正确,如果我将它复制到控制台并运行它,但我必须将无值更改为空。考虑到这一点,我尝试插入记录以确保没有空值,并且仍然出现错误,这让我认为这可能是pymysql或sqlalchemy的问题。 – pa1983

回答

0

对于那些谁通过搜索相同的错误输出过这个问题绊倒:

一些试验,我发现,如果我打开呼应查看查询后,然后把SQL插入字符串,并试图将它mySQL控制台的代码将工作。

这使我得出的结论是,问题必须存在于SQLAlchemy或我正在使用的pymysql连接中,所以我尝试将pymysql更改为mySQLdb,并发现查询按预期工作,并且因为它以前在我在SQLite3中有数据库。