如何将Pandas DataFrame写到PostgreSQL表中
在这篇文章中,我们将研究一些方法,在Python中把Pandas数据帧写到PostgreSQL的表中。
方法1:使用to_sql()函数
to_sql函数用于将给定的数据框架写入一个SQL数据库中。
语法
df.to_sql(‘data’, con=conn, if_exists=’replace’, index=False)
参数 :
- data:表的名称。
- con:与数据库的连接。
- if_exists: 如果表存在或不存在。”替换 “或 “追加”。
- index:真或假。
示例:
在下面演示的例子中,我们导入所需的包和模块,建立与PostgreSQL数据库的连接,并通过使用to_sql()方法将数据帧转换为PostgreSQL表。最后,使用fetchall()方法获取所有行。
# import packages
import psycopg2
import pandas as pd
from sqlalchemy import create_engine
# establish connections
conn_string = 'postgres://postgres:pass@127.0.0.1/Airlines_Database'
db = create_engine(conn_string)
conn = db.connect()
conn1 = psycopg2.connect(
database="Airlines_Database",
user='postgres',
password='pass',
host='127.0.0.1',
port= '5432'
)
conn1.autocommit = True
cursor = conn1.cursor()
# drop table if it already exists
cursor.execute('drop table if exists airlines_final')
sql = '''CREATE TABLE airlines_final(id int ,
day int ,airline char(20),destination char(20));'''
cursor.execute(sql)
# import the csv file to create a dataframe
data = pd.read_csv("airlines_final.csv")
data = data[["id","day","airline","destination"]]
# Create DataFrame
print(data)
# converting data to sql
data.to_sql('airlines_final', conn, if_exists= 'replace')
# fetching all rows
sql1='''select * from airlines_final;'''
cursor.execute(sql1)
for i in cursor.fetchall():
print(i)
conn1.commit()
conn1.close()
输出:
方法2:使用execute_values()函数
psycopg2库中的execute_values()函数被用来获取给定数据框架的postgres表。
语法: psycopg2.extras.execute_values(cur, sql, argslist, template=None, page_size=100, fetch=False)
参数:
- cur – 将用于运行查询的游标。
- sql – 将被运行的查询。必须有一个单一的百分比s占位符,它将被VALUES列表所取代。
- argslist – 一个包含查询参数的系列或字典的列表。在字体和内容方面必须遵循该模板。
- template – 将被合并到argslist中的每个项目的片段,以形成查询。
- page_size – 每个语句可以拥有的argslist项目的最大数量。
- fetch – 它类似于fetchall。数值可以是 “True “或 “False”。
示例:
在这个例子中,同样的CSV文件被用在这个方法中。代码从导入包开始,然后我们形成一个自定义函数execute_values,其中给定的数据框架、连接和表名被作为参数给出。使用execute_values()方法,数据框架的行和值被更新到PostgreSQL表中。定义的方法包含一个异常处理块,如果没有异常,则打印 “execute_values()完成”。
# import packages
import psycopg2
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()
返回值 1
print("execute_values() done")
cursor.close()
# establishing connection
conn = psycopg2.connect(
database="Airlines_Database",
user='postgres',
password='sherlockedisi',
host='127.0.0.1',
port='5432'
)
sql = '''CREATE TABLE airlines_final1(id int ,day
char(20) ,airline char(20),destination char(20));'''
# creating a cursor
cursor = conn.cursor()
cursor.execute(sql)
data = pd.read_csv("airlines_final.csv")
data = data[["id", "day", "airline", "destination"]]
# using the function defined
execute_values(conn, data, 'airlines_final1')
输出:
execute_values() done