Python は Mysql データベースに接続し、Java は Python スクリプトを読み取って、個人の学習記録エクスペリエンスの動的なパラメータ転送と追加、削除、変更、その他の操作を実現します。

目次

序文:

1. プロジェクト概要

2.MySQLデータベース

(1) データのインポート 

(2) データベースの追加、削除、変更、問い合わせ

3. Java は Python スクリプトを読み取り、動的なパラメータの受け渡しを実装します。

 (1) 初期探査

 (2) 具体例

    a. データベース削除操作

    b. データベースの操作を追加

4. その他の詳細

要約する

序文:

       今回は大学のデータ合成演習でプロジェクトをやっているので、プロジェクトの具体的な内容については話しません。ここでは主にCSDN上での作業の一部を書いて記録したいと思いますが、同時に他の人の参考にできれば良いと思います。

1. プロジェクト概要

      まず私のプロジェクトについて簡単に説明しますと、広告のクリック率を予測するプロジェクトを作りました。このプロジェクトは、2021 iFLYTEK AI Developer Contest-Advertising Click-through Rate Prediction Challengeからのものです。データ セットは「Advertising Click-through Rate Estimation.csv」で、13 の特徴フィールド、6 日間のデータ、および合計が含まれています。エントリー数は 390,000 件を超えました。以下は、その特徴的なフィールドの説明です。

        したがって、私たちの要件は次のとおりです。

        1. データの前処理

        2. データ可視化運用

        3. 機械学習または深層学習手法を使用して予測する

        4. Mysql を使用してデータセットを保存し、データの追加、削除、変更、クエリを実現します。

        5. 判定ボタンを設計し、トレーニング済みモデルを使用してデータベースでクエリされたデータを予測し、結果を設計されたインターフェイスに出力します。また、この機能は以下の要件を満たす必要があります。 予測結果をインターフェース上に表示するだけでなく、ローカルディスク上にファイルとして保存する保存機能も提供する必要があります。

        ここでは、私がこれまでに行った関連する仕事と、私が遭遇した問題についてお話しすることに重点を置きます。

2.MySQLデータベース

       それまでは、データベースについてあまり知識がありませんでした。むしろ表面的な知識しかありませんでした。ソフトウェアのダウンロードとインストールについては、ここでは詳しく説明しません。私は Mysql ベンチワークとそれに付属するコンソールを使用しています。

(1) データのインポート 

       まず、39万件のデータを入れたんですが、どうすればいいでしょうか?右!まずテーブルを作成しましょう。おそらく次のようになります。 hymという名前の新しいデータベースを作成し、データベース内にggという名前の新しいテーブルを作成しました。

 

       テーブルを構築するときは、元の csv ファイルに基づいて、各列変数が整数 (int) であるか文字 (varchar (255)) であるかを判断する必要があることに注意してください。構築時にこれらの間違いを犯さないように注意してくださいそうでない場合は、後でエラーが報告されます。文字列が非常に長い場合は、文字列に割り当てられる長さがそれ自体の長さより大きくなければならないことに注意してください。そうでない場合は、varchar( 255 )などのエラーが報告されます。

       Mysql のさまざまなデータ型については、次の記事をご覧ください。

MySQL のデータ型の概要 - myxlp - Blog Park (cnblogs.com) icon-default.png?t=N3I4https://www.cnblogs.com/-xlp/p/8617760.html

       では、データをインポートするにはどうすればよいでしょうか? ここには 2 つの方法があります。データが非常に少ない場合は、以下に示すように、ソフトウェアの組み込みデータ インポート機能を直接使用できます。

       テーブルを右クリックすると、テーブル日付インポート ウィザードが表示されます。中学生の英語レベルの私でも直接理解できます。データ インポートです。ファイルを選択してインポートします (インターネット上にはチュートリアル記事も多数あります)。しかし、これには非常に重大な欠点があります。ただ、データが多すぎると1つずつインポートするのでインポートが遅すぎるだけですが、数百万のデータがある場合、結果は想像できます(⌯꒪꒫꒪)੭

        したがって、2 番目の方法を直接選択し、コンソール コマンドを使用してインポートします。次のコンソールに入り、root パスワードを入力します。

        その後、簡単な指示を数行入力するだけで完了します~。ただし、最初にデータベースを選択することを忘れないでください。(退役軍人は知っていますが、何も知らない初心者を助けるために書きました)

Load data infile 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/delete_new.csv' into table gg fields terminated by ',';

      Load data infile はデータをインポートする命令であり、その後に多くのパラメーターを続けることができます。delete_new.csv は処理したデータ セットです。「C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/」は、データベースがデータを認識できるようにデータ セット CSV ファイルを配置するアドレスです (これは私のコンピュータの場合)、テーブル gg は、作成した gg テーブル上で「,」で終わることを意味し、区切り文字が「,」で区切られていることを意味します。

       ただし、インポート時にいくつかの詳細に注意する必要があります。たとえば、データセット内の null 値については、事前に処理するか、関連するコードを使用して事前に標準化する必要があります。そうしないと、エラーが発生します。データ入力の途中で出てくると再インポートが面倒なので、怠け者です、ぴゅぴゅ(*∩ω∩)。

       インポートが完了したら、成功したかどうかを確認してみましょう。

       ワークベンチ ソフトウェアで上位 1000 エントリを直接表示できます。

       何?? すべてのデータを見たいって言いましたよね?◔ ‸◔? インターネット上にはたくさんの方法があるはずですが、csv ファイルに直接アクセスするか、データベース コマンドを使用して検索することをお勧めします。

(2) データベースの追加、削除、変更、問い合わせ

       次に、Python を使用してデータベースの追加、削除、変更、クエリを単純に実装しました。ここでは、Python ライブラリ pymysql を直接呼び出しています。次のコードはデータベースの接続操作です。接続する前にデータベースを開くことを忘れないでください。

import pymysql

def Connection():
  try:
    db = pymysql.connect(host="localhost", user="root"
                         , password="自己的密码", database="自己的数据库")
    print('数据库连接成功!')
  except pymysql.Error as e:
    print('数据库连接失败'+str(e))
  finally:
    db.close()
Connection()

       追加、削除、変更、問い合わせにはデータベースの基本的なコマンドを使用しますが、ここでは簡単に説明しますので、必要な場合はオンラインで検索してください。たとえば、次のようになります。Python は mysql データベースに接続して、_Lazy_Goat の blog-CSDN blog を追加、削除、変更、およびチェックします

1. コマンドの追加 (増加): insert ステートメントを使用します。たとえば、プロジェクトに新しいデータを追加したい場合は、各列変数の値を入力する必要があります (ここでは省略しました。最初の 3 つの変数のみです)。しかし、一般的なフォーマットはこれです!

2. 削除コマンド(delete):delete文を使用し、下図はid番号に従ってデータを削除します。

 3. 変更/更新コマンド (modify): update ステートメントを使用します。これは、ID 番号の他の 3 つの変数も変更します。ここではいくつかの変数のみを書きましたが、必要に応じて自分で変数を追加することもできます。

4. 検索コマンド (search): find ステートメントを使用します。次の図は ID 番号に基づいてデータを検索します。ただし、あいまいなクエリが必要な場合は、自分で調べることができます。ここでは実行しませんでした。

3. Java は Python スクリプトを読み取り、動的なパラメータの受け渡しを実装します。

 (1) 初期探査

      私は Python と C++ をよく使いますが、Java はほとんど使いません ૮₍ ˃ ⤙ ˂ ₎ა だから、これが私が最も長い時間を費やす場所です、基本的に 0 から始まるので、インターネットからたくさんの情報を借ります。Python スクリプトを読み取るにはいくつかの方法があることがわかりました。ここでは私が調べた 2 つの方法に焦点を当てます。次の記事はいくつかの方法の例です。

(メッセージ 1 件) Java で Python ライブラリを使用する方法 - CSDN ライブラリicon-default.png?t=N3I4https://wenku.csdn.net/answer/20587f5dae09441a8acec27633ab7bb7#:~:text=java%E8%B0%83%E7%94%A8python%201%20 % E4%BD%BF%E7%94%A8%20Java%20%E8%87%AA%E5%B8%A6%E7%9A%84%20Java%20Runtime%EF%BC%88java.lang.Runtime%EF % BC%89%E7%B1%BB%E7%9A%84%20exec、Java%20%E5%92%8C%20Python%20%E4%B9%8B%E9%97%B4%E5%88%9B % E5%BB%BA%E4%BA%92%E7%9B%B8%E8%B0%83%E7%94%A8%E7%9A%84%E9%80%9A%E9%81%93%EF % BC%8C%E5%8F%AF%E4%BB%A5%E5%9C%A8%20Java%20%E7%A8%8B%E5%BA%8F%E4%B8%AD%E8%B0%83 % E7%94%A8%20Python%20%E7%A8%8B%E5%BA%8F%E3%80%82 最初に Jython を試しましたが、 Jython       が長い間更新されていないことがわかり、 Python のサードパーティ ライブラリはサポートされていません。そのまま G に進みます。このプロジェクトのために機械学習をしなければなりません! そしてデータ分析!サードパーティのライブラリが多数あります。

そこで、私たちは単にjava に付属の exec() を使用する       最も基本的なメソッドに注目しました。これはさらに重量があり、完成するまでに 2 日間取り組みました。おそらく、これは多くの偉い人にとっての小児科ですが、かわいい初心者の私にとっては少し残酷です。もちろん、インターネット上には多くのアイデアがあり、大いに参考になりましたが、中程度では私のニーズを解決することはできませんでした。そこで、一生懸命考えて、あらゆるデバッグを行った結果、ついに成功しました。以下のコンテンツが、この点でニーズがある初心者や友人に役立つことを願っています。✧*。 (ˊᗜˋ*) ✧*。 以下、記事をお借りしましたので、必要な方は読んでみてください。

(メッセージ 1 件) サードパーティのライブラリicon-default.png?t=N3I4を使用して Python を呼び出すと、Java Runtime.getRuntime().exec() に戻り値がありません spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST %7ERate-1-106955890-blog-104648277.235%5Ev28%5Epc_relevant_t0_download& Depth_1-utm_source=distribute.pc_relevant.none-task-blog- 2%7Edefault%7ECTRLIST%7ERate-1-106955890-blog-10464827 7.235%5Ev28%5Epc_relevant_t0_download&utm_relevant_index=2 ( 1 メッセージ) Java でパラメータを動的に渡して Python スクリプトを呼び出す___Thorny のブログ - CSDN ブログicon-default.png?t=N3I4https://blog.csdn. net/thorny_v/article/details/61417386

 

       良い!さて、本題に戻ります。

       パッケージ化された py スクリプトの場合、パラメータを渡す必要がなく、py ファイルを実行するだけでよい場合は、次の記事のように、書かれた多くのコードをオンラインで直接入手できます。これは非常に良いと思います。良く書かれています。最も基本的な動的パラメータの受け渡しも含まれていますが、私の問題を解決することはできません。(メッセージ 1 件) Java でパラメータを動的に渡して Python スクリプトを呼び出す___Thorny のブログ - CSDN ブログicon-default.png?t=N3I4https://blog.csdn.net/thorny_v/article/details/61417386

      動的パラメータの受け渡しの問題: 

      いろいろ調べたところ、sysモジュールはPythonスクリプトファイルに導入する必要があり、sys.argv[i]がスクリプト名であることが分かりました。i は 1 から始まります。9 個のパラメータを渡す必要がある場合は、1 から 9 までになります。以下の記事は私にアイデアを与えた記事です

Python がコマンドラインicon-default.png?t=N3I4パラメータを取得する方法

      まず、より基本的な動的パラメータ渡しコード (Java) を見てみましょう。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class python {
    public static void main(String[] args) {
        // Python脚本文件路径
        String pythonScriptPath = "你的python文件的路径";
        // 参数传递给Python脚本的字符串
        String arg1 = "  ";

        try {
            // 构建命令行执行Python脚本的命令
            String[] cmd = {"编译器的环境,如果你有虚拟环境的编译器,可以直接输入到python.exe", pythonScriptPath, arg1};
            Process process = Runtime.getRuntime().exec(cmd);

            // 获取Python脚本的输出流
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            // 读取Python脚本的输出
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            // 等待Python脚本执行完毕
            process.waitFor();
            // 获取Python脚本的返回值
            int exitCode = process.exitValue();
            System.out.println("Python脚本执行完毕,返回值:" + exitCode);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

       上記のコードは、Python スクリプトを読み取るための比較的基本的なコードです。いくつかの場所にコメントを付けています。文字列 cmd[ ] の後にパラメータが続いていることを強調する価値があります。最初のものは、この種の仮想環境のようなコンパイラ環境です。が構築され、サードパーティのライブラリがその中にダウンロードされます。作成した仮想環境にコンパイラ アドレスを入力して、python.exe を見つけます。2 番目は Python スクリプト ファイルのアドレスで、3 番目は渡す必要があるパラメータです。もちろん、必要に応じて、後ろに無制限のパラメータを追加できます。

       上記のコードをベースに、私自身の調査とさまざまな検索情報を組み合わせて、データベースと組み合わせる方法をついに見つけました。次は取り出して詳しくお伝えします!(◍˃̶ᗜ˂̶◍)✩

 (2) 具体例

    a. データベース削除操作

       これは他のものに比べて比較的単純なので、最初に取り出してください。ID 番号に基づいてデータを削除する場合、まず Java コードを見てみましょう。

private void deleteData(String id) {
        String sql = "DELETE FROM gg WHERE id=" + id; // SQL删除语句
        String[] cmd = { "C:\\Users\\Lenovo\\AppData\\Local\\Continuum\\anaconda3\\envs\\tf2\\python.exe"
                , "D:\\myeclipse workspace\\java418\\src\\student\\delete.py", sql }; // Python脚本文件和参数
        try {
            ProcessBuilder pb = new ProcessBuilder(cmd);
            Process p = pb.start();

            BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                // 显示删除结果
                textArea.append(line + "\n");
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

       この SQL は、渡したい id パラメータです。前のアドレスは私のパスです。独自のパスに変更できます。gg は私のデータ テーブルです。独自のパスに変更する必要があります。次に、対応する py スクリプト ファイルを見てみましょう。

import pymysql
import sys
# 从Java传递的第一个参数是SQL语句
sql = sys.argv[1] #!!!!!!!!!!!!!!!
# 数据库连接信息
host = "localhost"
user = "root"
password = "password"
database = "hym"
# 连接数据库
conn = pymysql.connect(host='localhost', user='root', password='自己的密码', db='自己的数据库')
cursor = conn.cursor()
# 执行SQL语句
try:
    cursor.execute(sql)
    conn.commit()
    print("删除成功!")
except Exception as e:
    conn.rollback()
    print("删除失败  错误信息:", e)
# 关闭数据库连接
cursor.close()
conn.close()

       知らせ!sys.argv[1] を参照してください。これは非常に重要です。ID が渡されるようにする必要があります。

        もう 1 つ重要な質問があります。Python での入力に input() 関数を使用しないでください。input() 関数は Java での動的パラメータの受け渡しには役に立ちません。単に直接与えるだけです。

    b. データベースの操作を追加

        Javaコード:

 // 调用Python脚本添加数据
      String[] cmd = {"C:\\Users\\Lenovo\\AppData\\Local\\Continuum\\anaconda3\\envs\\tf2\\python.exe",
            		"D:\\myeclipse workspace\\java418\\src\\student\\add.py",
                    id, date, user_id, product, campaign_id, webpage_id, product_category_id,
                    user_group_id, gender, age_level, user_depth, var_1, isClick};
      try {
          Process process = Runtime.getRuntime().exec(cmd);
          process.waitFor();
      } catch (Exception ex) {
          ex.printStackTrace();
      }

       Python スクリプト コード:

import pymysql
import sys

# 从Java传递的参数是13个值:id,date,user_id,product,campaign_id,webpage_id,product_category_id,
# user_group_id,gender,age_level,user_depth,var_1,isClick
id = sys.argv[1]
date = sys.argv[2]
user_id = sys.argv[3]
product = sys.argv[4]
campaign_id = sys.argv[5]
webpage_id = sys.argv[6]
product_category_id = sys.argv[7]
user_group_id = sys.argv[8]
gender = sys.argv[9]
age_level = sys.argv[10]
user_depth = sys.argv[11]
var_1 = sys.argv[12]
isClick = sys.argv[13]

# 连接数据库
conn = pymysql.connect(host='localhost', user='root', password='自己的密码', db='自己的数据库')
cursor = conn.cursor()
# 执行插入操作
try:
    sql = "INSERT INTO gg (id,date,user_id,product,campaign_id,webpage_id,product_category_id,user_group_id,gender,age_level,user_depth,var_1,isClick) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
    val = (id,date,user_id,product,campaign_id,webpage_id,product_category_id,user_group_id,gender,age_level,user_depth,var_1,isClick)
    cursor.execute(sql, val)
    conn.commit()
    print("数据插入成功!")
except Exception as e:
    conn.rollback()
    print("数据插入失败!  错误信息:", e)
cursor.close()
conn.close()

       検索操作と更新操作については、データベース ステートメントが異なり、渡されるパラメーターの数が異なることを除いて、上記と似ています。ご自身で試してみてください。必要な場合は、私にプライベート メッセージを送信するか、コメントをください!

4. その他の詳細

データ分析、機械学習手法、最終的なインターフェースの構築など、       プロジェクトの他の側面については、私も参加して修正しましたが、内容が少し多すぎるため、ここでは詳しく説明しません。 。必要があれば、私とプライベートにチャットして話し合うこともできます。以下はいくつかのプロジェクトのスクリーンショットです~


要約する

       今回は私の学習体験の一部です。皆さんのコミュニケーションを歓迎します。私も常に学習しています。問題がある場合は指摘して、一緒に進歩し、一緒に頑張りましょう。この記事が役に立った場合、またはよく書かれていると思われた場合は、皆さんが私を励ますために親指を立ててくださることを願っていますははははは、皆さんありがとうございます~

 

おすすめ

転載: blog.csdn.net/m0_51440939/article/details/130238333