📜  如何将 pandas DataFrame 插入现有的 PostgreSQL 表?

📅  最后修改于: 2022-05-13 01:55:29.842000             🧑  作者: Mango

如何将 pandas DataFrame 插入现有的 PostgreSQL 表?

在本文中,我们将了解如何将 pandas DataFrame 插入到现有的 PostgreSQL 表中。

需要的模块

  • pandas:Pandas DataFrame 是二维大小可变的、潜在异构的表格数据结构,带有标记的轴(行和列)。数据框是一种二维数据结构,即数据以表格的方式在行和列中对齐。 Pandas DataFrame 由三个主要组件组成,即数据、行和列。
  • psycopg2:PostgreSQL 是一个功能强大的开源对象关系数据库系统。 PostgreSQL 在所有主要操作系统上运行。 PostgreSQL遵循DataBase系统的ACID属性,支持触发器、可更新视图和物化视图、外键。
  • sqlalchemy:SQLAlchemy 是Python SQL 工具包和对象关系映射器,可为应用程序开发人员提供 SQL 的全部功能和灵活性

我们通过导入包并创建格式的连接字符串来启动代码:

create_engine()函数将连接字符串作为参数并形成与 PostgreSQL 数据库的连接,连接后我们创建一个字典,并使用方法 pandas.DataFrame() 方法进一步将其转换为数据帧。

to_sql() 方法用于将 pandas 数据框插入到 Postgresql 表中。最后,我们使用 execute() 方法执行命令来执行我们的 SQL 命令,并使用 fetchall() 方法来获取记录。

示例 1:

使用 sqlalchemy 将 pandas DataFrame 插入到现有的 PostgreSQL 表中。以下示例中用于在 PostgreSQL 数据库中创建表的 create table 命令为:

代码:

Python3
import psycopg2
import pandas as pd
from sqlalchemy import create_engine
  
  
conn_string = 'postgres://user:password@host/data1'
  
db = create_engine(conn_string)
conn = db.connect()
  
  
# our dataframe
data = {'Name': ['Tom', 'dick', 'harry'],
        'Age': [22, 21, 24]}
  
# Create DataFrame
df = pd.DataFrame(data)
df.to_sql('data', con=conn, if_exists='replace',
          index=False)
conn = psycopg2.connect(conn_string
                        )
conn.autocommit = True
cursor = conn.cursor()
  
sql1 = '''select * from data;'''
cursor.execute(sql1)
for i in cursor.fetchall():
    print(i)
  
# conn.commit()
conn.close()


Python3
import psycopg2
import numpy as np
import psycopg2.extras as extras
import pandas as pd
  
  
def execute_values(conn, df, table):
  
    tuples = [tuple(x) for x in df.to_numpy()]
  
    cols = ','.join(list(df.columns))
    # SQL query to execute
    query = "INSERT INTO %s(%s) VALUES %%s" % (table, cols)
    cursor = conn.cursor()
    try:
        extras.execute_values(cursor, query, tuples)
        conn.commit()
    except (Exception, psycopg2.DatabaseError) as error:
        print("Error: %s" % error)
        conn.rollback()
        cursor.close()
        return 1
    print("the dataframe is inserted")
    cursor.close()
  
  
conn = psycopg2.connect(
    database="ENVIRONMENT_DATABASE", user='postgres', password='pass', host='127.0.0.1', port='5432'
)
  
df = pd.read_csv('fossilfuels.csv')
  
execute_values(conn, df, 'fossil_fuels_c02')


输出:

('Tom', 22)
('dick', 21)
('harry', 24)

PostgreSQL 中的输出:

PostgreSQL 中的输出表

示例 2:

在不使用 sqlalchemy 的情况下将 pandas DataFrame 插入现有的 PostgreSQL 表。像往常一样,我们使用 connect() 命令建立到 PostgreSQL 的连接并执行 execute_values() 方法,其中执行了“插入”SQL 命令。包含一个 try-except 子句以确保捕获任何错误(如果有)。

要查看或下载以下程序中使用的 CSV 文件:单击此处。

以下示例中用于在 PostgreSQL 数据库中创建表的 create table 命令为:

代码:

Python3

import psycopg2
import numpy as np
import psycopg2.extras as extras
import pandas as pd
  
  
def execute_values(conn, df, table):
  
    tuples = [tuple(x) for x in df.to_numpy()]
  
    cols = ','.join(list(df.columns))
    # SQL query to execute
    query = "INSERT INTO %s(%s) VALUES %%s" % (table, cols)
    cursor = conn.cursor()
    try:
        extras.execute_values(cursor, query, tuples)
        conn.commit()
    except (Exception, psycopg2.DatabaseError) as error:
        print("Error: %s" % error)
        conn.rollback()
        cursor.close()
        return 1
    print("the dataframe is inserted")
    cursor.close()
  
  
conn = psycopg2.connect(
    database="ENVIRONMENT_DATABASE", user='postgres', password='pass', host='127.0.0.1', port='5432'
)
  
df = pd.read_csv('fossilfuels.csv')
  
execute_values(conn, df, 'fossil_fuels_c02')

输出:

the dataframe is inserted

插入数据框后