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
: BitArray
bool
: Bool
box
: NpgsqlBox
bpchar
: String
bytea
: Byte[]
cidr
: (IPAddress Address, Int Netmask)
circle
: NpgsqlCircle
date
: DateOnly
daterange
: NpgsqlRange<DateOnly>
float4
: Float
float8
: Double
inet
: (IPAddress Address, Int Netmask)
int2
: Short
int4
: Int
int4range
: NpgsqlRange<Int>
int8
: Long
int8range
: NpgsqlRange<Long>
interval
: NpgsqlInterval
json
: String
line
: NpgsqlLine
lseg
: NpgsqlLSeg
macaddr8
: PhysicalAddress
macaddr
: PhysicalAddress
money
: Decimal
path
: NpgsqlPath
point
: NpgsqlPoint
polygon
: NpgsqlPolygon
record
: Object?[]
text
: String
timestamp
: DateTime
timestamptz
: DateTime
time
: TimeOnly
timetz
: DateTimeOffset
tsrange
: NpgsqlRange<DateTime>
tstzrange
: NpgsqlRange<DateTime>
uuid
: Guid
varbit
: BitArray
varchar
: String
void
: Void
xml
: String
我们的 SPI 利用 NPGSQL 客户端库提供了一个原生的 dotnet 实现,与现有客户端代码具有最大的兼容性。我们在非常低的级别拦截了 NPGSQL 调用,用 SPI 调用替换了客户端协议处理;否则,NPGSQL 保持不变。我们将 NPGSQL 测试套件导入为存储过程,并将其用于我们的测试,这使我们对兼容性水平有了很好的了解。
为了提高兼容性和添加功能,还有一些工作要做。我们 NPGSQL 测试中持续失败的最大类别是错误映射,因为 SPI 抛出的异常与 NPGSQL 不同。这些不兼容性虽然是细微的但数量众多;我们将继续努力改进它们。
以下是我们当前已测试的 SPI 操作:
我们缺乏对 multirange、enum 和 composite/table 类型的支持。我们打算添加它们。
我们的 SPI 实现缺少一些小功能,例如子事务,并且我们有时抛出错误的**方式**与 NPGSQL 不同(因此略有不兼容)。
我们的构建系统(包括 dpkg 和二进制输出)是可用的,但不如我们期望的那样整洁。
我们欢迎代码提交来解决这些问题中的任何一个,并希望随着时间的推移改进它们。
我们的操作系统支持
我们欢迎社区的声音。您可以通过我们的 GitHub 讨论论坛 联系我们,或发送电子邮件至 pldotnet@brickabode.com。