如何将CSV导入PostgreSQL已存在的数据库表中?
将CSV数据导入PostgreSQL已存在的表
你之前用SQL Server的PowerShell脚本导入数据的写法是这样的:
Import-Module SqlServer $connectionString = Invoke-Sqlcmd -Username "USERNAME" -Password "PASSWORD" -Server "SERVERNAME" -Database "DATABASE_NAME" Write-SqlTableData -DatabaseName "DASHBOARD_NAME" -SchemaName "SCHEMA_NAME" -TableName "TABLE_NAME" -Force -InputData -Path 'PATH WHERE THE FILE IS STORED'
针对PostgreSQL,这里给你两种适配的PowerShell实现方案:
方法一:用psql的COPY命令(推荐,性能最优)
psql是PostgreSQL自带的命令行工具,直接用它的COPY命令可以快速导入CSV,不需要额外安装模块。在PowerShell里调用的写法如下:
# 定义参数 $pgUser = "USERNAME" $pgPassword = "PASSWORD" $pgHost = "SERVERNAME" $pgDb = "DATABASE_NAME" $schemaName = "SCHEMA_NAME" $tableName = "TABLE_NAME" $csvPath = "PATH WHERE THE FILE IS STORED" # 设置环境变量传递密码(避免明文显示) $env:PGPASSWORD = $pgPassword # 执行psql命令导入数据 psql -U $pgUser -h $pgHost -d $pgDb -c "COPY $schemaName.$tableName FROM '$csvPath' WITH (FORMAT csv, HEADER true, DELIMITER ',');" # 清理环境变量 Remove-Item Env:PGPASSWORD
注意:如果CSV里的分隔符不是逗号,要把
DELIMITER ','改成你实际的分隔符;如果CSV没有表头,去掉HEADER true。
方法二:用PowerShell的Npgsql模块(类似SqlServer模块的写法)
先安装Npgsql模块(需要管理员权限):
Install-Module -Name Npgsql -Scope CurrentUser
然后编写导入脚本:
Import-Module Npgsql # 定义参数 $pgUser = "USERNAME" $pgPassword = "PASSWORD" $pgHost = "SERVERNAME" $pgDb = "DATABASE_NAME" $schemaName = "SCHEMA_NAME" $tableName = "TABLE_NAME" $csvPath = "PATH WHERE THE FILE IS STORED" # 读取CSV数据 $csvData = Import-Csv -Path $csvPath # 构建连接字符串 $connString = "Host=$pgHost;Username=$pgUser;Password=$pgPassword;Database=$pgDb" # 批量插入数据 $conn = New-Object Npgsql.NpgsqlConnection($connString) $conn.Open() # 生成插入语句模板(假设表的列和CSV表头完全对应) $columns = $csvData[0].PSObject.Properties.Name -join ", " $placeholders = ($csvData[0].PSObject.Properties.Name | ForEach-Object { "@$_" }) -join ", " $sql = "INSERT INTO $schemaName.$tableName ($columns) VALUES ($placeholders)" $cmd = New-Object Npgsql.NpgsqlCommand($sql, $conn) $bulkCopy = New-Object Npgsql.NpgsqlBulkCopy($conn) $bulkCopy.DestinationTableName = "$schemaName.$tableName" # 加载数据并执行批量插入 $table = New-Object System.Data.DataTable foreach ($col in $csvData[0].PSObject.Properties.Name) { $table.Columns.Add($col) } foreach ($row in $csvData) { $newRow = $table.NewRow() foreach ($col in $csvData[0].PSObject.Properties.Name) { $newRow[$col] = $row.$col } $table.Rows.Add($newRow) } $bulkCopy.WriteToServer($table) # 关闭连接 $conn.Close()
注意:这个方法适合数据量不大的场景,数据量大的话优先用方法一的COPY命令,性能差距很明显。
内容的提问来源于stack exchange,提问作者user19086677
相关产品推荐
相关产品推荐

