Postgres COPY
Data Migration

Harnessing the Power of PostgreSQL's COPY Command for Rapid Data Migration

by: Jerrish Varghese

November 07, 2023


When faced with the challenge of migrating large datasets into a PostgreSQL database, efficiency and speed are paramount. Traditional row-by-row insertion methods, while straightforward, can be painfully slow, turning data migration tasks into lengthy ordeals. However, by leveraging PostgreSQL's powerful COPY command, we can dramatically reduce migration times — from tens of minutes to under a minute, even for substantial datasets.

The Game-Changer: PostgreSQL's COPY Command

The COPY command in PostgreSQL is designed for bulk data loading, offering a significant performance advantage over individual INSERT statements. It can quickly move data between a file and a database table. By using this command in conjunction with Python's psycopg2 library and pandas for pre-processing data, we achieve an efficient and scalable data migration process.

Preparing the Data with Pandas

Before we can leverage the COPY command, we must prepare our data. This preparation involves loading the data from an Excel file, applying necessary transformations (like renaming columns or converting data types), and ensuring it matches the target PostgreSQL table's schema.

import pandas as pd

def load_file(xls, sheet_name):
    return pd.read_excel(xls, sheet_name=sheet_name)

Transforming Data for PostgreSQL

Once loaded, the data may require cleaning and type conversion to align with the PostgreSQL table schema. This process is streamlined using pandas:

def prepare_dataframe(df, column_mapping, column_type_mapping):
    # Strip, replace, and rename columns
    df.columns = [col.strip().replace('\n', '') for col in df.columns]
    df.rename(columns=column_mapping, inplace=True)
    # Convert data types
    for column, dtype in column_type_mapping.items():
        df[column] = df[column].astype(dtype)
    return df

The Speedy Migration: Utilizing COPY Command via Psycopg2

To use the COPY command, we convert the pandas DataFrame into an in-memory buffer that mimics a file, then COPY this data directly to the PostgreSQL table. This approach sidesteps the overhead associated with individual INSERT operations, slashing data migration times.

import io
import csv
import psycopg2

def dataframe_to_csv_stringio(df):
    buffer = io.StringIO()
    df.to_csv(buffer, header=False, index=False, sep='\t', na_rep='NULL', quoting=csv.QUOTE_NONNUMERIC)
    return buffer

def copy_from_stringio(buffer, table_name, connection):
    with connection.cursor() as cur:
        cur.copy_from(buffer, table_name, sep="\t", null='None')

Orchestrating the Migration

With the data prepared and a method to utilize the COPY command established, orchestrating the entire migration process involves a few concise steps:

  1. Load and Prepare the Data: Load the data from the Excel file and apply any necessary transformations.
  2. Establish a Database Connection: Use psycopg2 to connect to your PostgreSQL database.
  3. Truncate the Target Table (if required): Optionally clear the target table to ensure only the most up-to-date data is present.
  4. Execute the COPY Command: Use the prepared in-memory buffer to bulk-insert data into the PostgreSQL table.
def migrate_data(xls_path, sheet_name, table_name, column_mapping, column_type_mapping, db_args):
    df = load_file(xls_path, sheet_name)
    df = prepare_dataframe(df, column_mapping, column_type_mapping)
    conn = psycopg2.connect(**db_args)
    buffer = dataframe_to_csv_stringio(df)
    copy_from_stringio(buffer, table_name, conn)


The combination of pandas for data manipulation, psycopg2 for PostgreSQL interaction, and the strategic use of PostgreSQL's COPY command revolutionizes data migration tasks. This method not only simplifies the process but also significantly accelerates it, reducing operation times from 20 minutes to less than a minute for our dataset. For developers and database administrators, this approach offers a powerful tool for handling large-scale data migrations efficiently.

By adopting this technique, you can ensure that your data migrations are not only accurate but also impressively swift, allowing you to focus on more critical tasks at hand.

contact us

Get started now

Get a quote for your project.


Edstem Technologies LLC
254 Chapman Rd, Ste 208 #14734
Newark, Delaware 19702 US


Edstem Technologies Pvt Ltd
Office No-2B-1, Second Floor
Jyothirmaya, Infopark Phase II
Ernakulam, Kerala 682303

© 2024 — Edstem All Rights Reserved

Privacy PolicyTerms of Use