2017-10-06 41 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中有數據庫。