F# 连接 SQLProvider 与 Postgres
F# Connect SQLProvider with Postgres
我是 F# 和 .Net 世界的初学者,我正在努力使这个 F# 脚本工作:
#r "./packages/SQLProvider/lib/netstandard2.0/FSharp.Data.SqlProvider.dll"
#r "./packages/SQLProvider/lib/netstandard2.0/netstandard.dll"
#r "./packages/Npgsql/lib/netstandard2.0/Npgsql.dll"
open FSharp.Data.Sql
open Npgsql
let [<Literal>] ConnString =
"Host=localhost;" +
"Port=5431;" +
"Database=suavetododb;" +
"Username=postgres;" +
"Password=postgres"
let [<Literal>] DbVendor = Common.DatabaseProviderTypes.POSTGRESQL
let [<Literal>] ResPath = @"./packages/Npgsql/lib/netstandard2.0"
type Sql =
SqlDataProvider<
DbVendor,
ConnString,
"",
ResPath,
1000,
true>
这是我得到的错误:
error FS3033: The type provider 'FSharp.Data.Sql.SqlTypeProvider' reported an error: Could not resolve field token 0x04000523, due to: Could not load type of field 'Npgsql.NpgsqlConnection+d__28:<>u__2' (7) due to: Could not load file or assembly 'System.Threading.Tasks.Extensions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. assembly:System.Threading.Tasks.Extensions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 type: member:(null) signature: assembly:(my_filesystem)/API/packages/Npgsql/lib/netstandard2.0/Npgsql.dll type:d__28 member:(null) signature:
这很奇怪,因为 Npgsql
实际上是导入的(所以最后一个 #r
实际上有效)。
数据库已启动 docker:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4704763ec2ba suave_rezoom_db:0.1 "docker-entrypoint.s…" 25 hours ago Up 2 hours 0.0.0.0:5431->5432/tcp todo_rezoom_1
此外,该项目是通过 .Net Core 2.1.200 生成的,运行 Linux。
这是因为类型提供程序需要解析第三方驱动程序的依赖项(Npgsql
在这种情况下),但它不能,因为它无法访问完整的依赖项树,例如NuGet(或 Paket)可以。您需要将 System.Threading.Tasks.Extensions.dll
复制到 Npgsql.dll
所在的同一文件夹(您的 ResPath
),以便类型提供程序可以解析该程序集。
完成后,您会发现还需要复制 System.Runtime.CompilerServices.Unsafe
。
我是 F# 和 .Net 世界的初学者,我正在努力使这个 F# 脚本工作:
#r "./packages/SQLProvider/lib/netstandard2.0/FSharp.Data.SqlProvider.dll"
#r "./packages/SQLProvider/lib/netstandard2.0/netstandard.dll"
#r "./packages/Npgsql/lib/netstandard2.0/Npgsql.dll"
open FSharp.Data.Sql
open Npgsql
let [<Literal>] ConnString =
"Host=localhost;" +
"Port=5431;" +
"Database=suavetododb;" +
"Username=postgres;" +
"Password=postgres"
let [<Literal>] DbVendor = Common.DatabaseProviderTypes.POSTGRESQL
let [<Literal>] ResPath = @"./packages/Npgsql/lib/netstandard2.0"
type Sql =
SqlDataProvider<
DbVendor,
ConnString,
"",
ResPath,
1000,
true>
这是我得到的错误:
error FS3033: The type provider 'FSharp.Data.Sql.SqlTypeProvider' reported an error: Could not resolve field token 0x04000523, due to: Could not load type of field 'Npgsql.NpgsqlConnection+d__28:<>u__2' (7) due to: Could not load file or assembly 'System.Threading.Tasks.Extensions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. assembly:System.Threading.Tasks.Extensions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 type: member:(null) signature: assembly:(my_filesystem)/API/packages/Npgsql/lib/netstandard2.0/Npgsql.dll type:d__28 member:(null) signature:
这很奇怪,因为 Npgsql
实际上是导入的(所以最后一个 #r
实际上有效)。
数据库已启动 docker:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4704763ec2ba suave_rezoom_db:0.1 "docker-entrypoint.s…" 25 hours ago Up 2 hours 0.0.0.0:5431->5432/tcp todo_rezoom_1
此外,该项目是通过 .Net Core 2.1.200 生成的,运行 Linux。
这是因为类型提供程序需要解析第三方驱动程序的依赖项(Npgsql
在这种情况下),但它不能,因为它无法访问完整的依赖项树,例如NuGet(或 Paket)可以。您需要将 System.Threading.Tasks.Extensions.dll
复制到 Npgsql.dll
所在的同一文件夹(您的 ResPath
),以便类型提供程序可以解析该程序集。
完成后,您会发现还需要复制 System.Runtime.CompilerServices.Unsafe
。