MySQLとPythonの相互作用の例

MySQLとPythonの相互作用の例

1. データを準備する

データテーブルを作成する

-- 「Jingdong」データベースを作成します。create database jing_dong charset=utf8;

-- 「Jingdong」データベースを使用します。use jing_dong;

-- 商品データテーブルを作成する create table goods(
 id int unsigned 主キー auto_increment nullではない、
 名前varchar(150)がnullではありません、
 cate_name varchar(40) NULLではない、
 brand_name varchar(40) NULLではありません、
 価格 小数点(10,3) nullでない デフォルト 0,
 is_showビットはNULLではないデフォルトは1、
 is_saleoff ビットが null でない デフォルト 0
);

データの挿入

-- goods テーブルにデータを挿入します。 insert into goods values(0,'r510vc 15.6 インチ ノートブック','notebook','ASUS','3399',default,default); 
商品に値を挿入します(0,'y400n 14.0インチ ラップトップ','ノートブック','Lenovo','4999',default,default);
商品に値を挿入します(0,'g150th 15.6インチ ゲーミング ラップトップ','ゲーミング ラップトップ','Thor','8499',default,default); 
商品に値を挿入します(0,'x550cc 15.6インチノートブック','notebook','ASUS','2799',default,default); 
商品に値を挿入します(0,'x240 Ultrabook','Ultrabook','Lenovo','4880',default,default); 
商品に値を挿入します(0,'u330p 13.3インチ ウルトラブック','Ultrabook','Lenovo','4299',default,default); 
商品に値を挿入します(0,'svp13226scb touch ultrabook','ultrabook','Sony','7999',default,default); 
商品に値を挿入します(0,'iPad mini 7.9インチタブレット','タブレット','Apple','1998',default,default);
商品に値を挿入します(0,'ipad air 9.7 inch tablet','tablet','Apple','3388',default,default); 
商品に値(0,'iPad mini with Retina Display','タブレット','apple','2788',default,default)を挿入します。 
商品に値を挿入します(0,'ideacentre c340 20インチオールインワンコンピューター','デスクトップ','Lenovo','3499',default,default); 
商品に値を挿入します(0,'vostro 3800-r1206 デスクトップ コンピューター','デスクトップ','Dell','2899',default,default); 
商品に値を挿入します(0,'imac me086ch/a 21.5インチ オールインワン コンピュータ','デスクトップ','Apple','9188',default,default); 
商品に値を挿入します(0,'at7-7414lp デスクトップ コンピューター Linux )','デスクトップ','Acer','3699',default,default); 
商品に値を挿入します(0,'z220sff f4f06pa ワークステーション','サーバー/ワークステーション','HP','4288',default,default); 
商品に値を挿入します(0,'poweredge ii server','server/workstation','dell','5388',default,default); 
商品に値を挿入します(0,'mac pro プロフェッショナル デスクトップ コンピュータ','サーバー/ワークステーション','Apple','28888',default,default); 
商品に値を挿入します(0,'hmz-t3w ヘッドマウントディスプレイデバイス','ラップトップアクセサリ','Sony','6999',default,default); 
商品に値を挿入します(0,'ビジネスバックパック','ラップトップアクセサリ','ソニー','99',default,default); 
商品に値を挿入します(0,'x3250 m4 ラック サーバー','サーバー/ワークステーション','ibm','6888',default,default); 
商品に値を挿入します(0,'ビジネスバックパック','ラップトップアクセサリ','ソニー','99',default,default);

2. SQLドリル

1. SQL文の強化

タイプ cate_name の製品名と価格を「Ultrabook」として照会します。

cate_name = 'Superbook' の場合、商品から名前、価格を選択します。

製品タイプを表示

cate_name によって goods グループから cate_name を選択します。

すべてのコンピュータ製品の平均価格を算出し、小数点以下2桁を残します

goods から round(avg(price),2) を avg_price として選択します。

各商品の平均価格を表示します

cate_name による商品グループから cate_name、avg(price) を選択します。

各タイプの製品の最も高価なもの、最も安価なもの、平均価格、数量を照会します

cate_name によって goods グループから cate_name、max(price)、min(price)、avg(price)、count(*) を選択します。

平均価格より高い価格の商品をすべて照会し、価格の降順で並べ替えます

商品からID、名前、価格を選択 
価格 > (select round(avg(price),2) as avg_price from goods) の場合 
価格降順で並び替え;

各タイプの最も高価なコンピュータを見つける

商品から*を選択
内部結合 
 (
  選択
  カテゴリ名、 
  max(price) を max_price として、 
  min(price) を min_price として、 
  avg(price) を avg_price として、 
  count(*) から商品グループを cate_name で取得
 ) として goods_new_info 
goods.cate_name=goods_new_info.cate_name かつ goods.price=goods_new_info.max_price の場合;

2. 「製品カテゴリ」テーブルを作成する

-- 商品カテゴリテーブルを作成する create table if not exists goods_cates(
 id int unsigned 主キー auto_increment,
 名前varchar(40) nullではない
);

商品テーブル内の商品の種類を照会する

cate_name によって goods グループから cate_name を選択します。

グループ化の結果をgoods_catesデータテーブルに書き込む

goods_cates (name) に挿入し、cate_name で goods グループから cate_name を選択します。

3. テーブルデータを同期する

goods_catesデータテーブルを通じてgoodsテーブルを更新する

goods を g として更新し、内部結合 goods_cates を c として g.cate_name=c.name に設定し、g.cate_name=c.id を設定します。

4. 「製品ブランドテーブル」テーブルを作成する

作成...選択を使用して、データ テーブルを作成し、同時に 1 ステップずつレコードを書き込みます。

-- brand_name によって商品グループから brand_name を選択します。

-- データテーブルを作成するときにデータを一緒に挿入します -- 注意: 別名 brand_name を使用する必要があります。そうしないと、名前フィールドに値が設定されません。create table goods_brands (
 id int unsigned 主キー auto_increment,
 name varchar(40) not null) brand_name を商品グループから名前として選択します。brand_name でグループ化します。

5. データを同期する

goods_brandsデータテーブルを通じて商品データテーブルを更新する

goods を g として更新し、g.brand_name=b.name で goods_brands を b として内部結合し、g.brand_name=b.id を設定します。

6. テーブル構造を変更する

goods のデータ テーブル構造を見ると、cate_name と brand_name の対応する型は varchar ですが、すべて数値であることがわかります。

desc商品;

alter tableステートメントを使用してテーブル構造を変更する

テーブル用品の変更 
cate_name cate_id int unsigned not null を変更します。
brand_name brand_id int unsigned not null を変更します。

7. 外部キー

それぞれgoods_catesテーブルとgoods_brandsテーブルにレコードを挿入します。

goods_cates(name) に値 ('ルーター'),('スイッチ'),('ネットワークカード') を挿入します。
goods_brands(name) に値 ​​('Haier'),('Tsinghua Tongfang'),('Shenzhou'); を挿入します。

商品テーブルに任意のレコードを書き込む

商品に挿入 (名前、カテゴリ ID、ブランド ID、価格)
values('LaserJet Pro P1606dn 白黒レーザープリンター', 12, 4,'1849');

すべての製品の詳細情報を照会する(内部接続経由)

g.id、g.name、c.name、b.name、g.price を goods から g として選択します。
内部結合 goods_cates を c として g.cate_id=c.id に結合します。
g.brand_id=b.id に対して、goods_brands を b として内部結合します。

すべての製品の詳細情報を照会する(左結合経由)

g.id、g.name、c.name、b.name、g.price を goods から g として選択します。
g.cate_id=c.id に goods_cates を c として結合します
g.brand_id=b.id で goods_brands を b として結合します。
  • 無効な情報の挿入を防ぐには、つまり、挿入する前にタイプやブランド名が存在するかどうかを確認するにはどうすればよいでしょうか。この問題を解決するには、前述の外部キーを使用できます。
  • 外部キー制約: データの有効性を検証する
  • キーワード: 外部キー、InnoDB データベース エンジンのみが外部キー制約をサポートします
  • 既存のデータ テーブルの外部キー制約を更新する方法
-- brand_id に外部キー制約を正常に追加しました。alter table goods add foreign key (brand_id) references goods_brands(id);
-- cate_id に外部キーを追加できませんでした -- エラー 1452 が表示されます -- エラーの原因: 存在しない cate_id 値 12 が追加されたため、最初に削除する必要があります alter table goods add foreign key (cate_id) references goods_cates(id);
  • データ テーブルを作成するときに外部キー制約を設定する方法は?
  • 注意: goods の cate_id のタイプは、goods_cates テーブルの id タイプと一致している必要があります。
テーブル商品を作成する(
 id int 主キー auto_increment nullではない、
 名前 varchar(40) デフォルト ''
 価格小数点(5,2)
 cate_id int 符号なし、
 ブランドID int 符号なし、
 is_showビットデフォルト1、
 is_saleoff ビット デフォルト 0、
 外部キー(cate_id)はgoods_cates(id)を参照します。
 外部キー(brand_id)はgoods_brand(id)を参照します。
);

外部キー制約を削除する方法

-- 最初に外部キー制約名を取得する必要があります。名前はシステムによって自動的に生成されます。テーブル作成ステートメント show create table goods; を表示することで名前を取得できます。
-- 名前を取得した後、名前に従って外部キー制約を削除できます。alter table goods drop foreign key foreign key name;

実際の開発では、外部キー制約はほとんど使用されないため、テーブル更新の効率が大幅に低下します。

3. データベース設計

「製品カテゴリ」テーブルを作成します(以前に作成されているため、再度作成する必要はありません)

テーブル goods_cates を作成する(
 id int unsigned 主キー auto_increment nullではない、
 名前varchar(40) nullではない
);

「製品ブランド」テーブルを作成します(すでに作成されているため、再度作成する必要はありません)

テーブル goods_brands を作成する (
 id int unsigned 主キー auto_increment nullではない、
 名前varchar(40) nullではない
);

「製品」テーブルを作成します(すでに作成されているため、再度作成する必要はありません)

テーブル商品を作成する(
 id int unsigned 主キー auto_increment nullではない、
 名前 varchar(40) デフォルト ''
 価格小数点(5,2)、
 cate_id int 符号なし、
 brand_id int 符号なし、
 is_showビットデフォルト1、
 is_saleoff ビット デフォルト 0、
 外部キー(cate_id)はgoods_cates(id)を参照します。
 外部キー(brand_id)はgoods_brand(id)を参照します。
);

「顧客」テーブルを作成する

顧客テーブルを作成(
 id int unsigned auto_increment 主キーがnullでない、
 名前varchar(30)がnullではない、
 アドレスvarchar(100)、
 tel varchar(11) が null でない
);

「注文」テーブルを作成する

テーブル注文を作成する(
 id int unsigned auto_increment 主キーがnullでない、
 order_date_time datetime が null ではない、
 customer_id int 符号なし、
 外部キー(customer_id)はcustomer(id)を参照します
);

「注文詳細」テーブルを作成する

テーブル order_detail を作成します(
 id int unsigned auto_increment 主キーがnullでない、
 order_id int unsigned not null、
 goods_id int unsigned not null、
 数量 tinyint unsigned not null、
 外部キー(order_id)はorders(id)を参照します。
 外部キー(goods_id)はgoods(id)を参照します
);

例示する

  • 上記のテーブルを作成する順序は必須です。つまり、goods テーブルの外部キー制約が goods_cates または goods_brands を使用する場合は、最初にこれら 2 つのテーブルを作成する必要があります。そうしないと、goods の作成は失敗します。
  • 外部キーを作成するときは、必ず型が同じであることを確認してください。そうでない場合は失敗します。

4. PythonでMySQLを操作する手順

モジュールのインポート

pymysqlモジュールをpyファイルにインポートする

pymysql からのインポート *

接続オブジェクト

  • データベースとの接続を確立するために使用される
  • オブジェクトを作成する: connect() メソッドを呼び出す
conn=connect(パラメータリスト)
  • パラメータ ホスト: ローカルマシンが 'localhost' の場合、接続する MySQL ホスト
  • パラメータポート: 接続するMySQLホストのポート。デフォルトは3306です。
  • パラメータデータベース: データベースの名前
  • パラメータ user: 接続のユーザー名
  • パラメータパスワード: 接続パスワード
  • パラメータ charset: 通信に使用するエンコード方式。UTF8 が推奨されます。

オブジェクトメソッド

  • close() は接続を閉じる
  • 専念()
  • cursor() は、SQL ステートメントを実行して結果を取得するために使用される Cursor オブジェクトを返します。

カーソルオブジェクト

  • SQL ステートメントを実行するために使用されます。最も頻繁に使用されるステートメントは、select、insert、update、delete です。
  • カーソルオブジェクトを取得する: Connectionオブジェクトのcursor()メソッドを呼び出す
cs1 = conn.カーソル()

オブジェクトメソッド

  • 近い()
  • execute(operation [,parameters]) はステートメントを実行し、影響を受けた行数を返します。主に挿入、更新、削除ステートメントを実行するために使用されます。また、作成、変更、削除ステートメントも実行できます。
  • fetchone()はクエリステートメントを実行し、クエリ結果セットの最初の行のデータを取得し、タプルを返します。
  • fetchall() がクエリを実行すると、結果セットのすべての行が取得され、各行がタプルを構成し、これらのタプルがタプルに格納されて返されます。

オブジェクトのプロパティ

  • rowcount 読み取り専用属性。最新の execute() 実行によって影響を受けた行数を示します。
  • connection現在の接続オブジェクトを取得します

5. 追加、削除、変更、確認

pymysql からのインポート *

main() を定義します:
 # 接続の作成 conn = connect(host='localhost',port=3306,database='jing_dong',user='root',password='mysql',charset='utf8')
 # カーソルオブジェクトを取得する cs1 = conn.cursor()
 # 挿入ステートメントを実行し、影響を受ける行数を返します。データを追加します。# count を増やします = cs1.execute('insert into goods_cates(name) values("hard disk")')
 #影響を受けた行の数を出力します print(count)

 count = cs1.execute('goods_cates(name) に値("CD") を挿入')
 印刷(カウント)

 # # 更新 # count = cs1.execute('update goods_cates set name="Mechanical hard disk" where name="Hard disk"')
 # # 削除 # count = cs1.execute('delete from goods_cates where id=6')

 # 前回の操作を送信します。以前に複数回実行したことがある場合は、すべて送信します。conn.commit()

 # カーソルオブジェクトを閉じる cs1.close()
 # 接続オブジェクトを閉じる conn.close()

__name__ == '__main__' の場合:
 主要()

データの行をクエリする

pymysql からのインポート *

main() を定義します:
 # 接続の作成 conn = connect(host='localhost',port=3306,user='root',password='mysql',database='jing_dong',charset='utf8')
 # カーソルオブジェクトを取得する cs1 = conn.cursor()
 # 選択ステートメントを実行し、影響を受ける行の数を返します。データのクエリ count = cs1.execute('select id,name from goods where id>=4')
 # 影響を受けた行の数を出力します print("%d 個のデータが見つかりました: " % count)

 i が範囲(カウント)内にある場合:
  # クエリ結果を取得する result = cs1.fetchone()
  # クエリ結果を印刷する print(result)
  # クエリ結果を取得する # Cursor オブジェクトを閉じる cs1.close()
 接続を閉じる()

__name__ == '__main__' の場合:
 主要()

複数行のデータをクエリする

pymysql からのインポート *

main() を定義します:
 # 接続の作成 conn = connect(host='localhost',port=3306,user='root',password='mysql',database='jing_dong',charset='utf8')
 # カーソルオブジェクトを取得する cs1 = conn.cursor()
 # 選択ステートメントを実行し、影響を受けた行の数を返します。データのクエリ count = cs1.execute('select id,name from goods where id>=4')
 # 影響を受けた行の数を出力します print("%d 個のデータが見つかりました: " % count)

 # i が範囲(count)内にある場合:
 # # クエリ結果を取得する# result = cs1.fetchone()
 # # クエリ結果を印刷する# print(result)
 # # クエリ結果を取得する result = cs1.fetchall()
 印刷(結果)

 # カーソルオブジェクトを閉じる cs1.close()
 接続を閉じる()

__name__ == '__main__' の場合:
 主要()

6. パラメータ化

  • SQL文のパラメータ化によりSQLインジェクションを効果的に防止できる
  • 注: これはPythonの文字列フォーマットとは異なり、すべて%sプレースホルダーを使用します。
pymysql からのインポート *

main() を定義します:

 find_name = input("アイテムの名前を入力してください:")

 # 接続の作成 conn = connect(host='localhost',port=3306,user='root',password='mysql',database='jing_dong',charset='utf8')
 # カーソルオブジェクトを取得する cs1 = conn.cursor()


 # # 安全でないメソッド # # " または 1=1 または " と入力します (二重引用符も入力します)
 # sql = 'select * from goods where name="%s"' % find_name
 # print("""sql===>%s<====""" % sql)
 # # 選択ステートメントを実行し、影響を受けた行の数を返します。すべてのデータをクエリします # count = cs1.execute(sql)

 # 安全な方法 # パラメータリストを構築する params = [find_name]
 # 選択ステートメントを実行し、影響を受けた行の数を返します: すべてのデータをクエリ count = cs1.execute('select * from goods where name=%s', params)
 # 知らせ:
 # 複数のパラメータがある場合は、パラメータ化が必要です。 # params = [値 1、値 2....] の場合、SQL ステートメントには複数の %s があります。 # 影響を受ける行の数を出力します print(count)
 # クエリ結果を取得# result = cs1.fetchone()
 結果 = cs1.fetchall()
 # クエリ結果を印刷する print(result)
 # カーソルオブジェクトを閉じる cs1.close()
 # 接続オブジェクトを閉じる conn.close()

__name__ == '__main__' の場合:
 主要()

上記はMySQLとPythonの連携例の詳細です。MySQLとPythonの連携の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • 学生のパフォーマンス管理システムを実現するためのPython MySQL
  • Python+MySQL で個人の書類管理システムを実装する
  • PythonはMySQLをベースに学生管理システムを実装します
  • PythonとMySQLデータベース間の相互作用の実装
  • MySQL とのやり取りを実装する Python 管理システムのサンプル コード

<<:  VUEはタイムライン再生コンポーネントを実装します

>>:  WMLとは何ですか?

推薦する

Docker を使用してエンタープライズレベルのカスタムイメージを構築する方法

序文退社前に、ある依頼を受けました。基本イメージ規格の変更により、最新の Docker イメージ規格...

Linux の総合システム監視ツール dstat の詳細な例

オールラウンドなシステム監視ツール dstat dstat は、vmstat、iostat、nets...

Vue3 ページ、メニュー、ルートの使用

目次1. メニューをクリックしてジャンプ1. ページ名の統一2. 管理ページを追加3. ルートを追加...

初心者がHTMLタグを学ぶ(2)

初心者は、いくつかの HTML タグを理解することで HTML を学習できます。この入門書は、初心者...

ES6のシンボルデータ型について詳しく説明します

目次シンボルデータタイプシンボルが表示される理由シンボルの特徴シンボルの応用rbオブジェクトにupメ...

MySQLデータベースについて学びましょう

目次1. データベースとは何ですか? 2. データベースの分類は? 3. データベースとデータ構造の...

dockerでビルドしたnacos1.3.0の実装

1. nacosデータベースを再開します。データベース名nacos_configユーザー名とパスワー...

JS のあらゆる場所で絶対等価演算子の使用をやめる

目次概要1. NULL値のテスト2. ユーザー入力を読み取る導入事実の根源はどこにあるのでしょうか?...

Dockerfile echoは、指定されたファイル内の複数行のテキストを実装する方法を指定します。

Dockerfile内の指定されたファイルに複数の行を追加します。echoの後の「$」記号に注意し...

MySQL でストリーミングクエリを使用してデータ OOM を回避する

目次1. はじめに2. JDBCはストリーミングクエリを実装する3. パフォーマンステスト3.1. ...

CSSはカラフルでスマートな影の効果を実現します

背景前景要素から特定の色を継承する影の効果を作成する方法を知りたいと思ったことはありませんか?方法に...

CSS の flex と inline-flex の違いの詳細な説明

inline-flex は inline-block と同じです。内部要素用の display:fl...

Promiseの紹介と基本的な使い方の簡単な分析

Promise は、ES6 で導入された非同期プログラミングのための新しいソリューションです。 Pr...

Dockerイメージの作成、アップロード、プル、デプロイを理解するための記事

目次1. 画像1. 鏡とは何ですか? 2. 画像の構成と目的(1) Dockerファイル(2)スクラ...

JavaScript における Promise の詳細な説明

目次Promise の基本的な使用法: 1. Promiseオブジェクトを作成する2. プロミス方式...