psycopg2 使用 executemany 新增数据 爆 can‘t adapt type ‘numpy.int64‘

  • Post author:
  • Post category:其他


使用psycopg2将一下DataFrame的数据,插入到PostgreSQL的某个模式中,具体方法如下:

import numpy as np
import pandas as pd
import psycopg2

# 根据传入的DataFrame和数据表名,在xxx模式中新建表以及插入数据
# 默认新建的表字段类型全是int,插入数据类型均为s
def inert_data(origin_table,mysql_table):
    # 获取数据中列名,便于数据的导入
    create_column = '('
    column_type = ''
    for i in origin_table.columns:
        #建表字段的数据类型
        create_column = create_column + i + ' int' + ','
        column_type = column_type + '%s' + ','
    create_column = create_column[:-1] +')'
    column_type = column_type[:-1]
    print('create_column: '+ create_column)
    print('column_type: '+column_type)
    print()

    # 数据库连接
    db = psycopg2.connect(dbname='xxx',user='xxx',password='xxx',host='xxx',port=8000,\
                       options="-c search_path=xxx,public")

    # 创建游标对象
    cursor = db.cursor()
    
    # 创建数据库表
    create_table = 'create table if not exists ' +  mysql_table + create_column
    print('创库语句:' + str(create_table))
    cursor.execute(create_table)

    # 删除表数据
    cursor.execute("delete from " + mysql_table)
    print('删表语句:' + str("delete from " + mysql_table))
    # 插入数据
    df = origin_table
    data = tuple([tuple(i) for i in df.values])
    sql = '''insert into ''' + mysql_table + ''' values (''' + column_type + ''')'''
    print('插入语句:'+str(sql))
    print('插入数据:'+str(data))
    
    cursor.executemany(sql,data)
    db.commit()
    db.close()
    
df = pd.read_excel('D:/test.xlsx')
inert_data(df,"test")

爆出以下错误

在这里插入图片描述

解决如下:

在import 中引入如下:

from psycopg2.extensions import register_adapter, AsIs
psycopg2.extensions.register_adapter(np.int64, psycopg2._psycopg.AsIs)

最终使用如下函数:

import numpy as np
import pandas as pd
import psycopg2
from psycopg2.extensions import register_adapter, AsIs
psycopg2.extensions.register_adapter(np.int64, psycopg2._psycopg.AsIs)

# 根据传入的DataFrame和数据表名,在upload模式中新建表以及插入数据
# 默认新建的表字段类型全是text,插入数据类型均为s -- 根据需求进行修改!
def inert_data(origin_table,mysql_table):
    # 获取数据中列名,便于数据的导入
    create_column = '('
    column_type = ''
    for i in origin_table.columns:
        #建表字段的数据类型
        create_column = create_column + i + ' text' + ','
        column_type = column_type + '%s' + ','
    create_column = create_column[:-1] +')'
    column_type = column_type[:-1]
    print('create_column: '+ create_column)
    print('column_type: '+column_type)
    print()

    # 数据库连接
    db = psycopg2.connect(dbname='xxx',user='xxx',password='xxx',host='xxx',port=8000,\
                       options="-c search_path=xxx,public")

    # 创建游标对象
    cursor = db.cursor()
    
    # 创建数据库表
    create_table = 'create table if not exists ' +  mysql_table + create_column
    print('创库语句:' + str(create_table))
    cursor.execute(create_table)

    # 删除表数据
    cursor.execute("delete from " + mysql_table)
    print('删表语句:' + str("delete from " + mysql_table))
    # 插入数据
    df = origin_table
    data = tuple([tuple(i) for i in df.values])
    sql = '''insert into ''' + mysql_table + ''' values (''' + column_type + ''')'''
    print('插入语句:'+str(sql))
    print('插入数据:'+str(data))
    
    cursor.executemany(sql,data)
    db.commit()
    db.close()
    
df = pd.read_excel('D:/qyjtest.xlsx')
inert_data(df,"test")

结果如下:

在这里插入图片描述



版权声明:本文为The_dream1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。