解决pandas使用to_sql,传入sqlalchemy的create_engine后无法保存数据的问题

解决方法

调用连接后需要手动提交,将原有程序:

from sqlalchemy import create_engine

engine = create_engine("xxxxx")
_db_conn = engine.connect()
dataframe.to_sql("数据表", if_exists="append", con=_db_conn, index=False)
_db_conn.close()

改为:

from sqlalchemy import create_engine

engine = create_engine("xxxxx")
_db_conn = engine.connect()
dataframe.to_sql("数据表", if_exists="append", con=_db_conn, index=False)
_db_conn.commit() # !!!!! 添加这一行 !!!!!
_db_conn.close()

问题解析

新版本的sqlalchemy需要手动commit()一下即可

首先,获取一个engine:

import yaml
import os
from sqlalchemy import create_engine


def get_sql_engine():
    # 数据库
    parent = os.path.dirname(os.path.realpath(__file__))

    with open(os.path.join(parent, "config.yaml"), encoding="utf-8") as f:
        config = yaml.load(f.read(), Loader=yaml.FullLoader)
        mysql_config = {
            "db": config['mysql_config']['db'],
            "host": config['mysql_config']['host'],
            "user": config["mysql_config"]['username'],
            "password": config["mysql_config"]['password'],
            "port": config['mysql_config']['port'],
        }
    engine = create_engine(
        "mysql+pymysql://{}:{}@{}:{}/{}".format(mysql_config['user'], mysql_config['password'], mysql_config['host'],
                                                mysql_config['port'], mysql_config['db']))
    return engine

然后在保存的时候使用:

engine = create_engine()
_db_conn = engine.connect()
dataframe.to_sql("数据表", if_exists="append", con=_db_conn, index=False)
_db_conn.commit() # 添加这一行
_db_conn.close()
使用 Pandas 的 to_sql 方法将 DataFrame 写入 SQL 数据库时,如果 DataFrame 中包含 JSON 类型的数据,并且使用 sqlalchemy.types.JSON 类型进行写入,可能会出现 JSON 字符串中出现多余的反斜杠的情况。 这是因为 sqlalchemy.types.JSON 类型将 JSON 数据转换为字符串时,使用了 JSONEncoder 对象进行转换,而 JSONEncoder 对象会将某些字符进行转义,例如双引号、单引号、换行符等。这些字符在写入数据库时可能会出现问题,因此需要进行转义。而在这个过程中,会出现多余的反斜杠。 为了避免这个问题,可以在写入数据库之前,先将 DataFrame 中的 JSON 数据转换为 Python 对象(例如字典或列表),然后再使用 json.dumps 方法将其转换为 JSON 字符串。这样可以确保 JSON 字符串中只有必要的反斜杠。 示例代码: ```python import pandas as pd import json from sqlalchemy import create_engine, types # 创建连接 engine = create_engine('postgresql://user:password@host:port/database') # 创建 DataFrame df = pd.DataFrame({'id': [1, 2, 3], 'json_data': [{'foo': 'bar'}, {'baz': 'qux'}, {'hello': 'world'}]}) # 将 JSON 数据转换为字符串 df['json_data'] = df['json_data'].apply(json.dumps) # 写入数据库 df.to_sql('my_table', engine, if_exists='replace', index=False, dtype={'json_data': types.JSON}) ``` 在上面的示例代码中,我们先将 JSON 数据转换为字符串,然后再进行写入数据库操作,这样可以避免 JSON 字符串中出现多余的反斜杠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆萌的代Ma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值