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