使用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...