pl/dotnet 为 PostgreSQL 增加了对 C# 和 F# 的全面支持。0.99 是我们的公开 beta 版本;我们希望与世界分享它的神奇之处。
这是一个 beta 版本;我们欢迎使用并期待您的反馈。
如何获取
更多详情如下。
pl/dotnet 让您在 PostgreSQL 的过程、函数和触发器中拥有 C# 和 F# 的全部强大功能。
CREATE OR REPLACE FUNCTION dynamic_record_generator_srf(lim INT8)
RETURNS SETOF record
AS $$
upperLimit = lim.HasValue ? lim : System.Int32.MaxValue;
for(long i=0;i<upperLimit;i++){ yield return new object?[] { i, $"Number is {i}" }; }
$$ LANGUAGE plcsharp;
CREATE OR REPLACE FUNCTION dynamic_record_generator_srf_fsharp(lim INT8)
RETURNS SETOF record
AS $$
let upperLimit = Option.defaultValue (int64 System.Int32.MaxValue) lim
seq { for i in 0L .. upperLimit - 1L do yield [| box i; $"Number is {i}" |] }
$$ LANGUAGE plfsharp;
我们支持所有 SQL 函数模式。
我们支持 40 种 PostgreSQL 类型,所有类型都映射到它们的 NPGSQL 标准 dotnet 类型。唯一值得注意的例外是 multirange、enum 和 struct 类型,我们希望将来能添加它们。所有数据类型都允许为 null,具有完整的数组支持,并且已通过 C# 和 F# 的全面单元测试。(出于技术原因,此处以 (PostgreSQL 类型: Dotnet 类型) 的列表形式展示,而不是表格。)
bit: BitArraybool: Boolbox: NpgsqlBoxbpchar: Stringbytea: Byte[]cidr: (IPAddress Address, Int Netmask)circle: NpgsqlCircledate: DateOnlydaterange: NpgsqlRange<DateOnly>float4: Floatfloat8: Doubleinet: (IPAddress Address, Int Netmask)int2: Shortint4: Intint4range: NpgsqlRange<Int>int8: Longint8range: NpgsqlRange<Long>interval: NpgsqlIntervaljson: Stringline: NpgsqlLinelseg: NpgsqlLSegmacaddr8: PhysicalAddressmacaddr: PhysicalAddressmoney: Decimalpath: NpgsqlPathpoint: NpgsqlPointpolygon: NpgsqlPolygonrecord: Object?[]text: Stringtimestamp: DateTimetimestamptz: DateTimetime: TimeOnlytimetz: DateTimeOffsettsrange: NpgsqlRange<DateTime>tstzrange: NpgsqlRange<DateTime>uuid: Guidvarbit: BitArrayvarchar: Stringvoid: Voidxml: String我们的 SPI 利用 NPGSQL 客户端库提供了一个原生的 dotnet 实现,与现有客户端代码具有最大的兼容性。我们在非常低的级别拦截了 NPGSQL 调用,用 SPI 调用替换了客户端协议处理;否则,NPGSQL 保持不变。我们将 NPGSQL 测试套件导入为存储过程,并将其用于我们的测试,这使我们对兼容性水平有了很好的了解。
为了提高兼容性和添加功能,还有一些工作要做。我们 NPGSQL 测试中持续失败的最大类别是错误映射,因为 SPI 抛出的异常与 NPGSQL 不同。这些不兼容性虽然是细微的但数量众多;我们将继续努力改进它们。
以下是我们当前已测试的 SPI 操作:
我们缺乏对 multirange、enum 和 composite/table 类型的支持。我们打算添加它们。
我们的 SPI 实现缺少一些小功能,例如子事务,并且我们有时抛出错误的**方式**与 NPGSQL 不同(因此略有不兼容)。
我们的构建系统(包括 dpkg 和二进制输出)是可用的,但不如我们期望的那样整洁。
我们欢迎代码提交来解决这些问题中的任何一个,并希望随着时间的推移改进它们。
我们的操作系统支持
我们欢迎社区的声音。您可以通过我们的 GitHub 讨论论坛 联系我们,或发送电子邮件至 pldotnet@brickabode.com。