2014-10-27 77 views
2

Go對自動提交使用sql.DB,對於手動提交使用sql.Tx。這對於一次性使用來說不是問題。問題是我有一個框架,它使用sql.DB來完成數據庫工作,現在我想讓他們中的一些人加入我的新事務,並且如果不修改現有框架以接受sql.Tx,似乎並不那麼容易。我想知道是否真的沒有一種簡單的方法來執行Go中的自動/手動切換?golang中的db交易

+0

@rightføld,我不認爲我寫的與Java比較是無關緊要的。這是我希望的。我應該修改其他人的帖子,至少我會得到該帖子的權威所有者的批准。 – 2014-10-27 18:59:35

+1

「一個框架」 - 那是什麼框架?知道這將有助於找到答案。還是它是你自己寫的框架? – rob74 2014-10-28 08:52:12

+0

@ElgsQianChen來自Stack Overflow文檔(http://stackoverflow.com/help/editing):「如果您對您的貢獻由其他可信用戶進行協作編輯的想法感到不滿意,則這可能不適合您「。 – Topo 2014-10-28 18:07:43

回答

1

不知道更多關於您正在使用的框架,我不認爲有沒有辦法做到這一點,而不修改框架。您應該真的嘗試獲取框架中包含的修改,因爲這裏的主要問題是您正在使用的框架設計不佳。在編寫新語言(特別是圖書館或框架)時,您應該瞭解這些約定並相應地設計您的軟件。

在旅途中,它不是很難完成這個功能,你只需要聲明的是這樣的Queryer(或者無論你怎麼稱呼它)接口:

type Queryer interface { 
    Query(string, ...interface{}) (*sql.Rows, error) 
    QueryRow(string, ...interface{}) *sql.Row 
    Prepare(string) (*sql.Stmt, error) 
    Exec(string, ...interface{}) (sql.Result, error) 
} 

這個接口是由隱實施sql.DBsql.Tx所以在聲明它之後,您只需修改函數/方法來接受Queryer類型而不是sql.DB

+0

我在Java中傳遞我的連接(* sql.DB),我可以讓客戶決定他們是否想要加入事務,但是在進行時,這似乎是不可能的,因爲如果客戶端決定加入一個事務,他們必須使用* sql.Tx而不是* sql.DB,因此,我的接口中斷了。 – 2014-10-28 20:26:06

+1

@ElgsQianChen我不明白爲什麼界面打破了。有了這個接口,你可以將(Tx和DB)傳遞給一個函數或方法,它可以工作,但也許我不理解你的觀點。 – Topo 2014-10-28 20:43:46

+0

謝謝@Topo,我最終將Tx和DB都傳遞給了我的函數。它的作品,但看起來不那麼優雅。 – 2014-10-29 06:55:47