Pandas の to_sql() がデータを mysql に挿入するときに発生する問題

pymysql を使用して API を駆動すると、次のエラーが発生します。

DatabaseError: SQL 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;' で実行に失敗しました: 文字列のフォーマット中に一部の引数が変換されませんでした

1. pandas データテーブルから mysql にデータを挿入するときに発生する問題

1.1. pymysql ドライバーインターフェースの問題

過去の経験によれば、mysql の操作は非常に簡単で、pymysql ドライバーをインストールするだけです。

pip インストール pymysql

pandas to_sql を通じてデータベースに書き込むコードを記述します。

import pandas as pd
import datetime
import uuid  # 数据库主键唯一

import pymysql

def mysql_db():
    # 连接数据库肯定需要一些参数
    conn = pymysql.connect(
        host="192.168.**.**",
        port=3306,
        database="M*****DB",
        charset="utf8",
        user="ty",
        passwd="****"
    )
    
    return conn
# df = 略去
# 增加唯一主键uuid
id = []
for i in range(len(df)):
    id.append(uuid.uuid1())
    
# 增加记录写入时间
df['CreateTime'] = datetime.datetime.now()
df['id'] = id

# 下面是出现问题的地方
conn = mysql_db()
tablename = '******'
dd = df[colsname]
# 浮点型截断数据处理
for k,v in cols_len.items():
    dd[k] = dd[k].round(v)
# 下面是出现问题的地方
dd.to_sql(tablename, conn,index=False, if_exists='append')

プログラムを実行し、次の質問を報告します。

DatabaseError: SQL 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;' で実行に失敗しました: 文字列のフォーマット中に一部の引数が変換されませんでした

クエリ ステートメントを実行してみます。

df0=pd.read_sql('select * from S*******y',conn)
df0

すべてが正常に動作し、結果は次のようになります。
ここに画像の説明を挿入

1.2. データベースの主キーについて

主キーには一般にuuidが使用され、PythonのuuidモジュールはMACアドレス、タイムスタンプ、名前空間、乱数、擬似乱数などの情報をもとにuuidを生成します。具体的な方法は以下のとおりです。

  • uuid.uuid1(): MAC アドレス、タイムスタンプ、乱数に基づいて一意の uuid を生成します。これにより、グローバルな一意性が保証されます。

  • uuid.uuid2(): アルゴリズムは uuid1 と同じですが、タイムスタンプの最初の 4 ビットが POSIX UID に置き換えられる点が異なります。ただし、Python には DCE ベースのアルゴリズムがないため、Python の uuid モジュールには uuid2 メソッドがないことに注意してください。

  • uuid.uuid3(namespace,name): uuid は名前空間と名前の md5 ハッシュ値を計算することによって与えられるため、名前空間内の異なる名前は異なる uuid を持つことが保証されますが、同じ名前は同じ uuid です。このうち、namespace は文字列など自分で手動で指定した数値ではなく、uuid モジュール自体で与えられる値です。uuid.NAMESPACE_DNS、uuid.NAMESPACE_OID、uuid.NAMESPACE_OID などの値。これらの値自体も UUID オブジェクトであり、特定のルールに従って計算されます。

  • uuid.uuid4(): 一定の確率で繰り返される擬似乱数によりuuidを取得

  • uuid.uuid5(namespace,name): 基本的には uuid3 と同じですが、使用されるハッシュ アルゴリズムが sha1 である点が異なります。

使用すると、データセット内のレコード数に応じて、UUID のリストが一度に生成され、テーブルに組み込まれます。

2. pandas の to_sql() には隠れた穴があります

解決:

pandas 公式 Web サイトや to_sql に関する他の多くの記事を確認しましたが、データベース接続の落とし穴については言及されていませんでしたが、pandas 公式 Web サイトの to_sql の例と他の記事の to_sql の間には 1 つの共通点があります。つまり、サードパーティの sqlalchemy を引用して、to_sql のエラーを解決するために ORM ライブラリを接続に使用します。

まず、sqlalchemyをインストールします。

pip インストール sqlalchemy

コードを変更して関数を追加します。

def mysql_engine_db():
    # 连接数据库肯定需要一些参数
    engine = create_engine(
        'mysql+pymysql://ty:***@192.168.**.**:3306/M*******DB'
        # mysql+pymysql://用户: 密码@url: 端口/数据库
    )
    
    return engine

# 下面是出现问题的地方
engine= mysql_engine_db()
tablename = '******'
dd = df[colsname]
# 浮点型截断数据处理
for k,v in cols_len.items():
    dd[k] = dd[k].round(v)
# 下面是出现问题的地方
dd.to_sql(tablename, engine,index=False, if_exists='append')   

こんなに簡単に解決できる問題なんですね!

参考:

宠乖仪。DatabaseError: SQL 'SELECT name FROM sqlite_master WHERE type='table' AND name=? で実行に失敗しました。CSDN博客。2021.09

weixin_43425561。DatabaseError: SQL 'SELECT name FROM sqlite_master WHERE type='table' AND name=? で実行に失敗しました。CSDN博客。2020.11

Qi Xiaobin. Python の uuid . Short Book. 2022.01

おすすめ

転載: blog.csdn.net/xiaoyw/article/details/131126161