如何将 pandas DataFrame 插入现有的 PostgreSQL 表?
在本文中,我们将了解如何将 pandas DataFrame 插入到现有的 PostgreSQL 表中。
需要的模块
- pandas:Pandas DataFrame 是二维大小可变的、潜在异构的表格数据结构,带有标记的轴(行和列)。数据框是一种二维数据结构,即数据以表格的方式在行和列中对齐。 Pandas DataFrame 由三个主要组件组成,即数据、行和列。
- psycopg2:PostgreSQL 是一个功能强大的开源对象关系数据库系统。 PostgreSQL 在所有主要操作系统上运行。 PostgreSQL遵循DataBase系统的ACID属性,支持触发器、可更新视图和物化视图、外键。
- sqlalchemy:SQLAlchemy 是Python SQL 工具包和对象关系映射器,可为应用程序开发人员提供 SQL 的全部功能和灵活性
我们通过导入包并创建格式的连接字符串来启动代码:
‘postgres://user:password@host/database’
create_engine()函数将连接字符串作为参数并形成与 PostgreSQL 数据库的连接,连接后我们创建一个字典,并使用方法 pandas.DataFrame() 方法进一步将其转换为数据帧。
to_sql() 方法用于将 pandas 数据框插入到 Postgresql 表中。最后,我们使用 execute() 方法执行命令来执行我们的 SQL 命令,并使用 fetchall() 方法来获取记录。
df.to_sql(‘data’, con=conn, if_exists=’replace’, index=False)
arguments are:
- name of the table
- connection
- if_exists : if the table already exists the function we want to apply . ex: ‘append’ help us add data instead of replacing the data.
- index : True or False
示例 1:
使用 sqlalchemy 将 pandas DataFrame 插入到现有的 PostgreSQL 表中。以下示例中用于在 PostgreSQL 数据库中创建表的 create table 命令为:
create table data( Name varchar, Age bigint);
代码:
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 中的输出:
示例 2:
在不使用 sqlalchemy 的情况下将 pandas DataFrame 插入现有的 PostgreSQL 表。像往常一样,我们使用 connect() 命令建立到 PostgreSQL 的连接并执行 execute_values() 方法,其中执行了“插入”SQL 命令。包含一个 try-except 子句以确保捕获任何错误(如果有)。
要查看或下载以下程序中使用的 CSV 文件:单击此处。
以下示例中用于在 PostgreSQL 数据库中创建表的 create table 命令为:
create table fossil_fuels_c02(year int, country varchar,total int,solidfuel int, liquidfuel int,gasfuel int,cement int,gasflaring int,percapita int,bunkerfuels int);
代码:
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