2

我有一个 sqlite 数据库说 c:\myDb.sqlite

我已经想出了如何在 SQLKata 中构建对这个数据库的查询:

$query = New-Object SqlKata.Query("myTable")
$compiler = New-Object SqlKata.Compilers.SqliteCompiler
$query.Where("myColumn", "1")
$result = $compiler.Compile($query)

但我完全不知道如何将其提交到我的 Sqlite 数据库。

任何人都可以帮忙吗?

谢谢,

亚历克斯

4

1 回答 1

3

从 PowerShell中让它工作受到两个困难的阻碍:

  • 通常,加载与 NuGet 包相关的程序集Microsoft.Data.Sqlite,尤其是 NuGet 包,通常需要在 PowerShell 中进行额外的、非显而易见的工作。

  • PowerShell 通常不会像这样显示扩展方法- 例如.Get()在查询实例上 - 需要显式调用静态方法来[SqlKata.Execution.QueryExtensions]代替。

具体来说,从 PowerShell 使用 NuGet 包需要以下步骤,这些步骤既不方便也不明显:

  • 仅仅安装 NuGet 包Install-Package或尝试从 .NET SDK 项目创建的本地缓存中使用它们$HOME/.nuget/packages通常是不够的,因为它们所依赖的任何程序集都不会出现在同一目录中,而这是Add-Type需要的。

  • 还必须通过辅助 .NET SDK 项目以适合平台的方式将它们解包到单个目标文件夹(每个包或组合),如本答案中所述。

  • 此外,对于Microsoft.Data.Sqlite包,平台适当的本机库(例如,win-x64\native\*.dll来自 .NET SDK 项目的发布文件夹的“运行时”文件夹子树)必须直接复制PowerShell(核心)中的目标文件夹,但奇怪的是在 Windows 中没有PowerShell,至少从包版本 5.0.9 开始


以下示例代码使用Add-NuGetType辅助函数,可从这个 MIT 许可的 Gist 获得,它自动执行上述所有步骤:

笔记:

  • 假设您已经查看了链接代码以确保它是安全的(我可以亲自向您保证,但您应该始终检查),您可以Add-NuGetType按如下方式直接安装(有关如何使该功能在未来会话中可用的说明或将其转换为脚本将显示):

    irm https://gist.github.com/mklement0/7436c9e4b2f73d7256498f959f0d5a7c/raw/Add-NuGetType.ps1 | iex
    
  • 首次运行时,该函数会下载并安装 .NET SDK 的私有副本,该副本嵌入在缓存稍后下载的 NuGet 包的文件夹中。此初始安装需要一段时间,-Verbose下面使用的开关会报告其进度。

  • Add-NuGetType不是用于生产用途,而是用于NuGet包的实验;运行以获取更多信息。help Add-NuGetType

# Reference the relevant namespaces.
using namespace SqlKata
using namespace SqlKata.Compilers
using namespace SqlKata.Execution
using namespace Microsoft.Data.Sqlite

# Load the SqlKata and Sqlite asssemblies.
# See the comments above for how to install the Add-NuGetType function.
# Note: On first call, a private copy of the .NET SDK is downloaded
#       on demand, which takes a while.
Add-NuGetType -Verbose SqlKata, SqlKata.Execution, Microsoft.Data.Sqlite

# First, create sample database './sample.db' with table 'sample_table'
@'
create table sample_table (Name string, Age int); 
insert into sample_table (Name, Age) values ("JDoe", 42), ("JRoe", 43);
.save ./sample.db
'@ | sqlite3

# Create a [SqliteConnection] instance...
$connection = [SqliteConnection]::new("Data Source=$PWD/sample.db")
# ... and create a query factory for it.
$sqliteDb = [QueryFactory]::new($connection, [SqlServerCompiler]::new())

# Create and execute a sample query.
$query = $sqliteDb.Query("sample_table").Where("Name", "JRoe")
# Note the need to use the static methods of [SqlKata.Execution.QueryExtensions],
# because PowerShell doesn't make *extension methods* automatically available.
[SqlKata.Execution.QueryExtensions]::Get($query) # outputs [Dapper.SqlMapper+DapperRow] instances
于 2021-09-10T02:54:44.563 回答