FreeSql生產環境自動公升級資料庫解決方案

2022-02-09 08:34:12 字數 3067 閱讀 1913

使用freesql,包含所有的orm資料庫,都會存在這樣的問題。在codefirst模式下,根據**自動更新資料庫,都建議不要在生產環境使用。為什麼呢?

其實不建議使用,主要是根據**自動生成資料時,極有可能會造成資料的丟失,比如修改字段型別,自動更新的結果可能並不是自己想的。

但是有一些使用場景是需要在生產環境自動公升級的,比如

我們有乙個cs客戶端的產品,客戶本地離線使用,客戶本地部署,資料庫也是本地資料庫,版本從1000,迭代到了1100,中間發布了100個版本。這中間可能有多次資料庫更改。我們的客戶也可能遍布全國各地,版本也都不相同。客戶如果沒有新的需求,可能會一直使用當前舊版本,只有在有新的需求,或者想使用新的功能時,才會公升級版本。所以公升級的時間也是不確定的,公升級要求客戶安裝新版軟體,執行後自動公升級。

那就真的不能在生產環境使用呢?

解決的思路其實就是自動公升級,但是在判斷需要公升級時,才自動公升級,同時公升級前先備份資料庫。

具體流程

程式內每次有資料庫變更,發布版本時,修改程式內對應版本。比如最開始是1000,最新是1100

在資料庫增加sysconfig表,字段包含dbver表示當前資料庫版本號

在資料庫增加dblog表,記錄資料庫公升級日誌,此項可選

在首次安裝時,檢查資料庫檔案不存在,表示首次安裝,首次安裝時建立sysconfig表和dblog表,同時更新sysconfig表dbver為程式中記錄版本號。增加dblog表日誌

以後再次執行時,先獲取sysconfig表dbver,判斷與程式中是否一致,

如果資料庫比程式中大,說明執行低版本的程式,根據情況可以禁止執行。也可以不同步資料庫,繼續執行,根據實際情況決定。如果對程式和資料庫一致性要求比較高,可以禁止執行。

如果資料庫比程式小,說明資料庫需要公升級,此時先備份現有資料庫,然後執行同步資料庫。

直接上**,比啥都清楚

program.cs檔案**

using bonn.helper;

using system;

using system.collections.generic;

using system.io;

using system.linq;

using system.threading.tasks;

using system.windows.forms;

using freesql.dataannotations;

using windowsclient.model;

using system.reflection;

namespace windowsclient

; pooling=true;min pool size=1")

.useautosyncstructure(syncdbstructure) //deebug自動同步實體結構到資料庫,release手動同步

.usemonitorcommand(cmd => console.writeline($"執行緒:\r\n"))

.build(); //請務必定義成 singleton 單例模式

if(syncdbstructure)

if (custdbpathexists == false)

int localdbver = fsql.select().first().dbver;

if (localdbver != serverdbver)

}catch (exception e)

}public static type gettypesbytableattribute()}}

};return tableassembies.toarray();}}

}

sysconfig.cs

using freesql.dataannotations;

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace windowsclient.model

/// /// 主鍵

///

[column(name = "dbver")]

public int dbver

/// /// 建立時間

///

[column(servertime = datetimekind.local, canupdate = false)]

public datetime createtime

/// /// 修改時間

///

[column(servertime = datetimekind.local, canupdate = true)]

public datetime updatetime

}}

dblog.cs

using freesql.dataannotations;

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace windowsclient.model

/// /// 主鍵

///

[column(name = "dbver")]

public int dbver

/// /// 建立時間

///

[column(servertime = datetimekind.local, canupdate = false)]

public datetime createtime

/// /// 修改時間

///

[column(servertime = datetimekind.local, canupdate = true)]

public datetime updatetime

}}

生產環境程式公升級流程

今天偶爾翻出以前做運維的筆記,感慨良多 當時剛參加工作,對工作有極大的熱情,做了很多筆記.現在很多多遺失了,現在也轉崗做開發了,運維方面的知識很多都不用了,生疏了 今天翻出筆記,乾脆就把紙質的文件 當時印象筆記和有道雲筆記等工具並不是很流行 重新記錄在部落格裡.檢查測試環境中需公升級的程式版本是否已...

FreeSql (二)自動遷移實體

freesql 支援 codefirst 遷移結構至資料庫,這應該是 o rm 必須標配的乙個功能。與其他 o rm 不同freesql支援更多的資料庫特性,而不只是支援基礎的資料型別,這既是優點也是缺點,優點是充分利用資料庫特性輔助開發,缺點是切換資料庫變得困難。不同程式設計師的理念可能不太一致,...

PHP自動判斷測試環境還是生產環境

由測試環境發布到生產環境要修改一些配置引數,該來該去挺麻煩還容易出錯。可以在nginx中配置乙個環境引數fastcgi param run env dev 來做判斷 php中判斷載入哪個配置檔案 define run env isset server run env server run env p...