postgresql 在不同环境下实现批量复制

7uzetpgm  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(145)

我有一个关于PostgreSQL中批量复制命令的问题。例如,我有一个示例命令复制文件CSV表如下

CREATE TEMPORARY TABLE AlterTable (
    a1 varchar(50),
    a2 varchar(50),
    a3 varchar(50),
    a4 varchar(50),
    a5 varchar(50),
    a6 varchar(255),
    a7 varchar(255),
    a8 varchar(255),
    a9 varchar(50),
    a10 varchar(50),
    a11 varchar(50),
    a12 varchar(50),
    a13 varchar(50),
    a14 varchar(50),
    a15 varchar(50),
    a16 varchar(50),
    a17 varchar(50),
    a18 varchar(50),
    a19 varchar(50),
    a20 varchar(50),
    a21 varchar(50));
COPY AlterTable FROM 'D:\1364746_855575_20221001_20221231.csv' DELIMITER ';' CSV HEADER;

字符串
这个命令工作得很好,但是我需要在我的Visual Studio代码中用C#实现这个命令,然后我需要在不同的环境中通过C#代码在开发,登台和产品环境中实现这个命令。我打算在wwwroot文件夹中创建新的csv文件,然后通过wwwroot文件夹中的路径执行上面的命令,如下面的命令

var extension = Path.GetExtension(file.FileName);
var fileName = Path.GetFileNameWithoutExtension(file.FileName)
+ "_" + fileImport.Id.ToString() + extension;
var filePath = $"{AppConstants.SettingKeys.StoredFilesImportingPath}/{fileName}";
if (!Directory.Exists($"wwwroot/{AppConstants.SettingKeys.StoredFilesImportingPath}"))
{
Directory.CreateDirectory($"wwwroot/{AppConstants.SettingKeys.StoredFilesImportingPath}");
}
await using (var streaming = File.Create($"wwwroot//{filePath}"))
{
    await file.CopyToAsync(streaming);
}
string getAbsolutePath = Path.GetFullPath($"wwwroot//{filePath}");


在我得到getAbsolutePath为'C:\Users{myComputerName}\Desktop{myfolder}{anothermyfolder}{anotheranothermyfolder}\wwwroot\importings\1112223_855575_20220401_20220630_10f7d877-baa 2 -4fcb-8500-88195f9a4596.csv'之后,我将其放入如下命令

CREATE TEMPORARY TABLE AlterTable (
    a1 varchar(50),
    a2 varchar(50),
    a3 varchar(50),
    a4 varchar(50),
    a5 varchar(50),
    a6 varchar(255),
    a7 varchar(255),
    a8 varchar(255),
    a9 varchar(50),
    a10 varchar(50),
    a11 varchar(50),
    a12 varchar(50),
    a13 varchar(50),
    a14 varchar(50),
    a15 varchar(50),
    a16 varchar(50),
    a17 varchar(50),
    a18 varchar(50),
    a19 varchar(50),
    a20 varchar(50),
    a21 varchar(50));
COPY AlterTable FROM 'C:\Users\{myComputerName}\Desktop\{myfolder}\{anothermyfolder}\{anotheranothermyfolder}\wwwroot\importings\1112223_855575_20220401_20220630_10f7d877-baa2-4fcb-8500-88195f9a4596.csv' DELIMITER ';' CSV HEADER;


这代表我犯了一个错误

  • 错误:无法打开文件“C:\Users{myComputerName}\Desktop{myfolder}{anothermyfolder}{anotheranothermyfolder}\wwwroot\importings\1112223_855575_20220401_20220630_10f7d877-baa 2 -4fcb-8500-88195f9a4596.csv”进行阅读:许可被拒绝提示:COPY FROM指示PostgreSQL服务器进程读取文件。你可能需要一个客户端工具,比如psql的\copy。SQL状态:42501*

谁能帮我解决上面的问题,我真的很绝望。然后我可以在不同的环境中实现它,比如在开发和测试环境中。先谢谢你了。

jgwigjjp

jgwigjjp1#

你正在做的(或者至少看起来正在做的),让我觉得效率很低。您将数据作为流,将其写入物理文件,然后尝试将该文件读入PostgreSQL。
还有其他方法可以解决这个问题。我的答案是here,展示了如何使用内置COPY命令的 Package 器将IEnumerableDataTable直接从C#上传到PostreSQL。如果内存中已经有了数据,难道不能简单地从中创建一个对象,然后使用类似于我的代码上传它吗?这比使用服务器的硬盘驱动器要好得多。

相关问题