上次用 C# Entity Framework Core 2.0 與 Oracle Provider 連結至 Oracle 資料庫。這次改用 PostgreSQL 開放式資料庫。所需要做的就是把 Oracle Provider 改用 PostgreSQL Provider。程式碼幾乎都不需要修改。
開始之前,稍微來了解一下 PostgreSQL。
PostgreSQL
PostgreSQL 自稱是世界上最先進的開源資料庫。 它是一種企業級的關連式資料庫管理系統,與最佳非開源的專有資料庫系統 Oracle,Microsoft SQL Server 和 IBM DB2 相當。 PostgreSQL 的特殊之處在於它不只是資料庫,它也是一個應用程序平台。
PostgreSQL 很快。在基準測試中,PostgreSQL 可以超過或匹配許多其他開放式和專有資料庫的性能。 PostgreSQL 允許使用多種編程語言編寫存儲過程(Stored Procedure)與涵式。 除了 C,SQL 和 PL/pgSQL 的預設包裝語言外,還可以簡單的啟用對其他語言的支援,例如 PL/Perl、PL/Python、PL/V8 (PL/JavaScript)、PL/Ruby 和 PL/R。對多種語言的支援使您可以選擇能夠最好地解決當前問題的結構的語言。
例如,使用 R 進行統計和製圖,使用 Python 調用 Web Services,使用 Python SciPY 程式庫進行科學計算,使用 PL/V8 進行數據驗證,處理字符串和處理 JSON 數據。 更簡單的是,找到所需的開源自由可用的函數,找出其編寫的語言,在 PostgreSQL 中啟用該特定語言,然後復制代碼。
近年來,我們見證了 NoSQL 資料庫的興起(儘管其中很多可能都被炒作了)。儘管 PostgreSQL 從根本上來說是關係型的,但您會發現很多處理非關係型數據的工具。 PostgreSQL 的 ltree 擴展自遠古時代就已經存在並提供圖形支援。hstore 擴展允許您存儲鍵值對 (Key/Value pairs)。JSON 和 JSONB 類型允許存儲類似於 MongoDB 的文檔。在許多方面,PostgreSQL 甚至在該術語誕生之前就已採用 NoSQL!
這裡就從 Oracle 的資料映對,來快速了解 PostgreSQL,將 Oracle 的 DEPT 與 EMP 資料表轉到 PostgreSQL。
1 | create table dept |
1 | create table emp |
DDL 語法與 Oracle 幾乎一樣,只有資料型態不同,PostgreSQL 的 date 型態只存到日期,要匹配 Oracle 的 date 型態可改用 timestamp 資料型態。
# psql 類似 Oracle Sqlplus |
以下的 CSV 格式資料可以用 SQL Developer 從 Oracle 資料庫 export 出來。
10,"會計部","紐約" |
7839,"KING","PRESIDENT",,1981-11-17,5000,,10 |
將它 import 到 PostgreSQL。
db01=> \copy dept from 'dept.csv' with csv; |
PostgreSQL 提供 JSON 和許多支援的功能。JSON 已成為 Web 應用程序中最流行的數據交換格式。也支援 JSONB 資料型態。
db01=> select row_to_json(emp) as employee from emp; |
PostgreSQL 資料準備好了,回到 C#。
C# EFCore 2.0 and PostgreSQL Provider
開啟 VS Code 建立一個專案。
$ > dotnet new console --name PgEFCoreSample |
首先要安裝專案需要的 NuGet Packages,這裡只需要將 Oracle Provider 換成 PostgreSQL Provider。這裡因用的 PostgreSQL Provider Npgsql.EntityFrameworkCore.PostgreSQL 版本比較新,所以也將 Microsoft EntityFramework Core 的版本更新。
$ PgEFCoreSample> dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL --version 3.1.4 |
現在專案目錄下的 PgEFCoreSample.csproj 檔案應該如下:
1 | <Project Sdk="Microsoft.NET.Sdk"> |
這裡也將 PostgreSQL 資料庫的連結資料放在 appsettings.json
1 | { |
PostgreSQL 資料庫位在我的 PC 虛擬機 Ubuntu Linux 上,只開放在上班時間。
反向工程 (Reverse Engineering)
直接使用反向工程產生資料模型。
$ PgEFCoreSample> dotnet ef dbcontext scaffold "Host=10.11.xx.xxx;Database=db01;Username=xxxx;Password=xxxxxxxx" Npgsql.EntityFrameworkCore.PostgreSQL --table emp --table dept -o Models -f |
它會在專案目錄下產生子目錄 Models 與 Dept.cs、Emp.cs 與 db01Context.cs。 這裡只要修改 db01Context.cs 的資料庫連結資料,讀取 appsettings.json 的設定。其他都不用動。
using System; |
資料讀取
1 | using System; |
$ PgEFCoreSample> dotnet run |
這與使用 Oracle Provider 的程式碼,只有 db01Context 名稱不一樣,其他都一樣。你可以複製新增、修改、刪除與其它程式碼來試試看。更換資料庫,只要抽換掉資料庫的 Provider。
PostgreSQL Schema 範例
這裡提供一個比較實用的 PostgreSQL Schema 範例,這原來是 Oracle 的 Schema。其實 DDL 都一樣,需要改的是資料型態。
這裡是 DDL 範例與範例資料 demo_ot_data.sql。
1 | CREATE TABLE regions |