📜  如何将 Pandas DataFrame 写入 PostgreSQL 表?

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

如何将 Pandas DataFrame 写入 PostgreSQL 表?

在本文中,我们将研究一些在Python中将 Pandas 数据帧写入 PostgreSQL 表的方法。

方法一:使用 to_sql()函数

to_sql函数用于将给定的数据帧写入 SQL 数据库。

句法

参数 :

  • 数据:表的名称。
  • con:连接到数据库。
  • if_exists:表是否存在。 “替换”或“附加”。
  • 指数:真或假。

例子:

在下面演示的示例中,我们导入所需的包和模块,建立与 PostgreSQL 数据库的连接,并使用 to_sql() 方法将数据帧转换为 PostgreSQL 表。最后,使用 fetchall() 方法获取所有行。

要访问使用的 CSV 文件,请单击此处。

Python3
# 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()


Python3
# 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()
        return 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')


输出:

方法 2:使用 execute_values()函数

psycopg2 库中的 execute_values()函数用于获取给定数据帧的 postgres 表。

句法:

参数:

  • cur –将用于运行查询的游标。
  • sql -将运行的查询。必须存在一个百分比 s 占位符,它将被 VALUES 列表替换。
  • argslist —包含查询参数的系列或字典列表。在字体和内容方面必须遵循模板。
  • 模板 -将合并到 argslist 中的每个项目以形成查询的片段
  • 页面大小——每个语句可以拥有的 argslist 项目的最大数量。
  • fetch -它类似于 fetchall。值可以是“真”或“假”

例子:

在此示例中,此方法中使用了相同的 CSV 文件。代码从导入包开始,然后我们形成一个自定义函数execute_values,其中给定的数据框、连接和表名作为参数给出。使用 execute_values() 方法将数据框行和值更新到 PostgreSQL 表中。定义的方法包含一个异常处理块,如果没有异常则打印“execute_values() done”。

Python3

# 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()
        return 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