python连接Mysql数据库,java读取python脚本实现动态传参以及增删改查等操作的个人学习记录心得

2023-10-26

目录

前言:

一、项目的概述

二、Mysql数据库

(1)导入数据 

(2)数据库增删改查

三、java读取python脚本,并实现动态传参

 (1)初期探索

 (2)具体实例

    a. 数据库的删除操作

    b. 数据库的添加操作

四、其他细节的问题

总结

前言:

       这次我在大学数据综合实践上做的一个项目,项目的具体内容我就不多说了。这里主要想把自己做的一部分工作写在CSDN上记录一下,同时如果能给其他人提供借鉴就更好了。

一、项目的概述

      先简单说一下我这个项目,我做了一个广告点击率预测的项目。这个项目来源于2021 iFLYTEK A.I. 开发者大赛-广告点击率预估挑战赛,数据集为“广告点击率预估.csv”,其中包含 13 个特征字段,6 天的数据,共计 39 万多条。下面是对其特征字段的描述:

        接着我们的要求有:

        1. 对数据进行预处理

        2. 数据可视化操作

        3. 利用机器学习或深度学习方法预测

        4. 使用Mysql存储数据集,实现数据的增删改查

        5. 设计判断按钮,利用训练好的模型对数据库中查询到的数据进行预测并输出结果到设计好的界面上。该功能还需满足以下要求:预测结果除了展示在界面上外,还需提供保存功能,将其以文 件形式保存在本地磁盘上

        这里我重点给大家说一下我做的相关工作和遇到的问题

二、Mysql数据库

       在此之前,我还没有太多接触过数据库的相关知识,或者说比较浅显。所以要从头开始学习,对于下载和安装软件,这里不在赘述了。我使用的是Mysql benchwork和自带的控制台。

(1)导入数据 

       首先我们把我们的39万条数据,要怎么办捏?对!我们先建个表,大概是下面这样啦:我新建了一个名字为hym的数据库,在数据库中新建了一个名字为gg的表

 

       值得注意的是:我建表时,要依据原始的csv文件来确定每个列变量时整数型(int)还是字符型(varchar(255)),建表时注意不要把这些搞错了,不然后期会报错。如果字符串很长,也记得注意给其分配的长度一定要大于它自身的长度,不然也会报错,比如varchar(255)

       关于Mysql的各种数据类型可以看下面的文章!

MySQL中数据类型介绍 - myxlp - 博客园 (cnblogs.com)icon-default.png?t=N3I4https://www.cnblogs.com/-xlp/p/8617760.html

       接着如何把数据导入呢?这里有两种方法,如果你的数据很少,你可以直接使用软件内置的导入数据的功能,如下所示:

       我们右键我们的表,有一个Table Date Import Wizard,我这种初中英语水平直接看懂,就是数据导入!我们选择我们的文件,导入即可(网上也有很多教程文章)。但是这个有一个非常严重的缺点!!!就是数据量太多的时候导入太慢啦,因为它是一条一条导入,如果你有上百万条数据,那结果可想而知(⌯꒪꒫꒪)੭

        所以我们直接选择第二种方法,使用控制台命令进行导入,我们进入如下的控制台,输入我们的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文件的地址,这样数据库才能识别到数据(对于我电脑是这样的),into table gg是指在我们创建的gg这个表上,terminated by ','代表他们的分隔符是用','分开的。

       但是导入时仍要注意一些细节问题,比如说对于数据集中的空值,要提前进行处理或使用相关代码提前进行规范,不然录入数据的过程中会出现报错,不然重导好麻烦,本人比较懒,嘤嘤嘤(*∩ω∩)。

       导入完成后,我们查看一下是否成功:

       我们直接在workbench软件中可以直接查看前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的博客-CSDN博客

1. 添加命令(增):使用insert语句,举个例子,比如针对我这个项目我要添加新的数据,就要把每个列变量都输入值进去(我这里省略了,只取了前三个变量),但大致格式是这样!

2. 删除命令(删):使用delete语句,下图是依据id号对数据进行删除。

 3. 修改/更新命令(改):使用update语句,这个也是针对id号来对其他三个变量进行修改,我这里也只是写了一部分变量,当然根据需要可以自己添加。

4. 查找命令(查):使用find语句,下图依据id号进行数据查找,但是如果有模糊查询需求的可以自己去了解一下,我这里并没有去做。

三、java读取python脚本,并实现动态传参

 (1)初期探索

      本人python和C++用的非常多,对于java的使用真是少之又少૮₍ ˃ ⤙ ˂ ₎ა,所以这里是我花费时间最长的一个地方,因为基本上是从0开始,我在网上借鉴了大量的资料。发现读取python脚本也有几种方法,我这里重点说我探索的两个,下面的文章是一些方法的举例

(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(),这位更是重量级,我搞它搞了两天,才搞好!可能这对很多大佬来说都是小儿科,但是对我这萌新小白来讲有点残忍了。我就疯狂去查资料,当然网上有很多思路,给了我很多借鉴,但适中没有解决我的需求。所以我苦思冥想,各种调试,终于成功!希望下面的内容可以帮助那些小白和对这方面有需求的友友!                     ✧*。 (ˊᗜˋ*) ✧*。 下面是我借鉴的一些文章,大家有需要也可以看看:

(1条消息) Java Runtime.getRuntime().exec()调用python含第三方库时无返回值_th3000的博客-CSDN博客icon-default.png?t=N3I4https://blog.csdn.net/th3000/article/details/106955890?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-104648277.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

      动态传参问题: 

      我又搜索了很多资料,知道了在python脚本文件中必须要引入sys模块,sys.argv[i]为脚本名。i从1开始,如果我们需要传入9个参数,就从1到9。下面文章是给我思路的文章

Python 获得命令行参数的方法 - 原心 - 博客园 (cnblogs.com)icon-default.png?t=N3I4https://www.cnblogs.com/saiwa/articles/5253713.html

      我们首先看一下比较基本的动态传参代码(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脚本的代码,一些地方我都用注释标出来了,值得强调的是,其中string cmd[ ]中跟的参数:第一个是编译器环境,像我这种是建了虚拟环境的,第三方库都下载在其中,我就要把我的编译器地址进入到我创建的虚拟环境中,找到python.exe。第二个是python脚本文件的地址,第三个是跟着需要传入的参数。当然后面可以跟无限个参数,按你自己的需求来。

       我根据以上代码,再结合自己的摸索和各种搜寻资料,终于研究出如何与数据库结合!下面我就拿出来和大家具体讲一下!(◍˃̶ᗜ˂̶◍)✩

 (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才会传进去

        还有一个重要的问题,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()

       至于查找操作和更新操作,跟上面是类似的,无非就是数据库语句不同、传参数量不同,大家可以自己尝试一下,如果有需求可以私信我或者给我评论!

四、其他细节的问题

       关于项目的其他方面,比如数据分析、机器学习方法、最终界面的搭建,这些我都有参与和修改,但是内容也有点多,就不在这里赘述了。如果有需求的友友也可以私聊我和我探讨。下面是一些项目的截图~


总结

       本次是我的一点学习心得体会,欢迎大家跟我沟通交流,我也是在不断学习中!有什么问题大家可以指出,一起进步一起加油。如果这篇文章对你有帮助或者你觉得写的很好,还是希望大家点个赞鼓励我一下哈哈哈哈哈哈,谢谢大家~

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python连接Mysql数据库,java读取python脚本实现动态传参以及增删改查等操作的个人学习记录心得 的相关文章

  • 更新写入 java 文本文件的对象

    将 Java 对象或列表写入文本文件是可以的 但我想知道如何更新或重写以前写入的对象而不再次写入对象 例如 假设有一个 java util List 有一组对象 然后将该列表写入文本文件 然后稍后该文件将被再次读取并从列表中获取所有对象 然
  • Java 接口合成方法生成,同时缩小返回类型

    我有 2 个接口和 2 个返回类型 interface interfaceA Publisher
  • 使用 Beautifulsoup 解析时保持 XML 文件的缩进

    我正在使用 BS4 解析 XML 文件并尝试将其写回新的 XML 文件 输入文件
  • 可变和不可变类变量如何初始化?

    运行下面的示例代码 class S i 0 a def init self self i 1 self a append 1 s1 S print s1 i s1 a s2 S print s2 i s2 a 输出将是 1 1 1 1 1
  • Java中使用final关键字会提高性能吗?

    在 Java 中 我们看到很多地方final可以使用关键字 但其使用并不常见 例如 String str abc System out println str 在上述情况下 str can be final但这通常被忽略 当一个方法永远不会
  • 修改void函数的输入参数并随后读取它

    我有一个相当复杂的 java 函数 我想使用 jUnit 进行测试 并且我正在使用 Mockito 来实现此目的 这个函数看起来像这样 public void myFunction Object parameter doStuff conv
  • 如何在运行时更改 JList 的单元格图标

    如何更改仅一个 JList 单元格的 JLabel 图标 例如 在 JList 中单击 我尝试访问使用 listCellRender 获取的 JLabel 但它不起作用 Override public void valueChanged L
  • Servlet上下文和Spring应用程序上下文的本质区别

    我正在阅读 spring 框架文档 现在我在应用范围概念 http docs spring io spring docs current spring framework reference htmlsingle beans factory
  • 使用当前日期时间的 RecyclerView 的动态节标题

    我将使用 RecyclerView 作为节标题 我想在 SQLite 数据库中插入每个日期和时间数据时创建节标题 我按照以下链接获取了此解决方案 但没有成功 请参考下图 对于上面的图像数据 使用以下代码或部分是静态的 List
  • 如何从列表中删除“\xe2”

    我是 python 新手 正在使用它在我的项目中使用 nltk 对从网页获得的原始数据进行单词标记后 我得到了一个包含 xe2 xe3 x98 等的列表 但是我不需要这些并想删除它们 我只是尝试过 if x in a and if a st
  • 没有名为 urllib.parse 的模块(我应该如何安装它?)

    我正在尝试在 CentOS 7 上运行 REST API 我读到 urllib parse is in Python 3 但我使用的是 Python 2 7 5 所以我不知道如何安装此模块 我安装了所有要求 但仍然无法运行该项目 当我寻找
  • 计算素数并附加到列表

    我最近开始尝试使用 python 解决 Euler 项目的问题 并且在尝试计算素数并将其附加到列表中时遇到了这个障碍 我编写了以下代码 但我很困惑为什么它在运行时不输出任何内容 import math primes def isPrime
  • 使用 lambda 或 Stream API 合并流以生成交替序列

    我有一些按预期返回 Stream 的代码 但也许可以用某种类型的 lambda 或 stream 操作替换它 而不是耗尽 a 中的迭代器while loop 它只是一种交替流中元素的方法first and second当其中一个元素耗尽时停
  • 在 python 中计时时,我应该如何考虑 subprocess.Popen() 开销?

    编码社区的成员比我更聪明 我有一个 python 问题要问你们 我正在尝试优化一个 python 脚本 该脚本 除其他外 返回子进程执行和终止的挂钟时间 我想我已经接近这样的事情了 startTime time time process s
  • 对 Python 的 id() 感到困惑[重复]

    这个问题在这里已经有答案了 我可以理解以下定义 每个对象都有一个身份 类型和值 对象的身份 一旦创建就永远不会改变 你可能会认为它是 对象在内存中的地址 这is操作员比较身份 两个物体 这id 函数返回一个代表其值的整数 身份 我假设上面的
  • 是否可以使用 Python 中的密码安全地加密然后解密数据?

    我在 python 程序中有一些数据 我想在使用密码写入文件之前对其进行加密 然后在使用它之前读取并解密它 我正在寻找一些可以根据密码进行加密和解密的安全对称算法 这个问题 https stackoverflow com questions
  • 错误:升级到 lombok 1.16.2 后包 javax.annotation 不存在

    我的 android 项目使用 lombok 1 16 0 构建得很好 但是一旦我将依赖项更改为目标 1 16 2 我在使用 lombok 注释的任何地方都会收到以下错误 Error 20 1 error package javax ann
  • 在文件中查找一行并将其删除

    我正在寻找一个小代码片段 它将在文件中找到一行并删除该行 不是内容而是行 但找不到 例如 我在以下文件中 我的文件 txt aaa bbb ccc ddd 需要有这样的功能 public void removeLine String lin
  • 每行中最后一次出现 True 的索引

    我有一个二维数组 a False False False False False True True True True True True True True True True True True True True True True
  • onActivityresult 数据为空

    这是我的相机应用程序 我想在其中捕获图像并裁剪它 但它拍照保存在我的 myimage 目录中 但不执行裁剪功能 请我需要帮助 我是这个领域的新人 这是我的相机开源代码 Intent intent new Intent MediaStore

随机推荐