pandas怎么写入数据库数据

305 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。​​ ​

Pandas是python中基于numpy和matplotlib的第三方数据分析库,与后两者共同构成了python数据分析的基础工具包,享有数分三剑客之名。Pandas 的目标是成为 Python 数据分析实践与实战的必备高级工具,其长远目标是成为最强大、最灵活、可以支持任何语言的开源数据分析工具

Pandas还拥有便捷的数据读写操作,相比于numpy仅支持数字索引,pandas的两种数据结构均支持标签索引,包括bool索引也是支持的

在使用pandas读取和写入数据库的时候,最好不要用pymssql直接去连服务器,读取数据可能不会出问题,但是在写入的时候,会出现一系列的问题。推荐使用sqlalchemy

 1、Mysql数据库

(1)插入数据

注意事项:因为pymysql不识别除%s之外的其他字符,例如%d,%f,因此,将sql语句的values全部设置为%s

def insertdata(data,table_name,connect):

    c_name = str(data.columns.tolist()).replace("'","").replace("[",'').replace("]",'').replace(" ","")
    c_type = str(['%s' for i in range(len(data.columns.tolist()))]).replace("'","").replace("[",'').replace("]",'').replace(" ","")

    data = [tuple(data.iloc[i]) for i in range(data.shape[0])]
    sql =  "insert into "+str(table_name)+"("+str(c_name)+") Values("+str(c_type)+");"

    cursor = connect.cursor()
    try:
        cursor.executemany(sql, data)
    except Exception as e:
        print("执行MySQL: %s 时出错:%s" % (sql, e))
        connect.rollback
    finally:
        cursor.close()
        connect.commit()
        connect.close()

t = pd.DataFrame([[1,2],[3.0,4.0]] ,columns=['t1','t2']) 
#connect是连接数据库信息
insertdata(t,'test',connect)

2、Oracle数据库

(1)插入数据

def insert_multiple(table_name, data, conn_db):
    """multiple insert
       parameters:
       *) table_name : table_name to load
       *) df : dataframe to load
       *) conn_db : a connection object from cx_oracle or open_connection
       *) batch_size : batch size of commit
    """
    cur = conn_db.cursor()
    sql = "INSERT INTO {0} ({1}) VALUES (:{2})".format(table_name,
                                                      ', '.join(data.columns),
                                                    ', :'.join(list(map(str,range(1, len(data.columns)+1)))))
#    print(sql) 
    rows = []
    for x in data.values:
        rows.append([None if pd.isnull(y) else y for y in x])
    cur.executemany(sql,rows)   
    conn_db.commit()
    conn_db.close()