用Python操作MySQL教程!干货满满!

news2025/1/21 9:35:54

python操作数据库介绍

Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库:

  • GadFly

  • mSQL

  • MySQL

  • PostgreSQL

  • Microsoft SQL Server 2000

  • Informix

  • Interbase

  • Oracle

  • Sybase …

你可以访问Python数据库接口及API查看详细的支持数据库列表。

不同的数据库你需要下载不同的DB API模块,例如你需要访问Oracle数据库和Mysql数据,你需要下载Oracle和MySQL数据库模块。

DB-API 是一个规范. 它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口 。

Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同的方式操作各数据库。

Python DB-API使用流程:

  • 引入 API 模块。

  • 获取与数据库的连接。

  • 执行SQL语句和存储过程。

  • 关闭数据库连接。

python操作MySQL模块

Python操作MySQL主要使用两种方式:

  1. DB模块(原生SQL)
  • PyMySQL(支持python2.x/3.x)

  • MySQLdb(目前仅支持python2.x)

  1. ORM框架
  • SQLAchemy

2.1 PyMySQL模板

本文主要介绍PyMySQL模块,MySQLdb使用方式类似

2.1.1 安装PyMySQL

PyMySQL是一个Python编写的MySQL驱动程序,让我们可以用Python语言操作MySQL数据库。

pip install PyMySQL  

2.2 基本使用

#! /usr/bin/env python  
# -*- coding: utf-8 -*-  
# __author__ = "shuke"  
# Date: 2018/5/13  
  
import pymysql  
  
# 创建连接  
conn = pymysql.connect(host="127.0.0.1", port=3306, user='zff', passwd='zff123', db='zff', charset='utf8mb4')  
  
# 创建游标(查询数据返回为元组格式)  
# cursor = conn.cursor()  
  
# 创建游标(查询数据返回为字典格式)  
cursor = conn.cursor(pymysql.cursors.DictCursor)  
  
# 1. 执行SQL,返回受影响的行数  
effect_row1 = cursor.execute("select * from USER")  
  
# 2. 执行SQL,返回受影响的行数,一次插入多行数据  
effect_row2 = cursor.executemany("insert into USER (NAME) values(%s)", [("jack"), ("boom"), ("lucy")])  # 3  
  
# 查询所有数据,返回数据为元组格式  
result = cursor.fetchall()  
  
# 增/删/改均需要进行commit提交,进行保存  
conn.commit()  
  
# 关闭游标  
cursor.close()  
  
# 关闭连接  
conn.close()  
  
print(result)  
"""  
[{'id': 6, 'name': 'boom'}, {'id': 5, 'name': 'jack'}, {'id': 7, 'name': 'lucy'}, {'id': 4, 'name': 'tome'}, {'id': 3, 'name': 'zff'}, {'id': 1, 'name': 'zhaofengfeng'}, {'id': 2, 'name': 'zhaofengfeng02'}]  
"""  

2.3 获取最新创建的数据自增ID

#! /usr/bin/env python  
# -*- coding: utf-8 -*-  
# __author__ = "shuke"  
# Date: 2018/5/13  
  
import pymysql  
  
# 创建连接  
conn = pymysql.connect(host="127.0.0.1", port=3306, user='zff', passwd='zff123', db='zff', charset='utf8mb4')  
  
# 创建游标(查询数据返回为元组格式)  
cursor = conn.cursor()  
  
# 获取新创建数据自增ID  
effect_row = cursor.executemany("insert into USER (NAME)values(%s)", [("eric")])  
  
# 增删改均需要进行commit提交  
conn.commit()  
  
# 关闭游标  
cursor.close()  
  
# 关闭连接  
conn.close()  
  
new_id = cursor.lastrowid  
print(new_id)  
"""  
8  
"""  

2.4 查询操作

#! /usr/bin/env python  
# -*- coding: utf-8 -*-  
# __author__ = "shuke"  
# Date: 2018/5/13  
  
import pymysql  
  
# 创建连接  
conn = pymysql.connect(host="127.0.0.1", port=3306, user='zff', passwd='zff123', db='zff', charset='utf8mb4')  
  
# 创建游标  
cursor = conn.cursor()  
  
cursor.execute("select * from USER")  
  
# 获取第一行数据  
row_1 = cursor.fetchone()  
  
# 获取前n行数据  
row_2 = cursor.fetchmany(3)  
#  
# # 获取所有数据  
row_3 = cursor.fetchall()  
  
# 关闭游标  
cursor.close()  
  
# 关闭连接  
conn.close()  
print(row_1)  
print(row_2)  
print(row_3)  

⚠️ 在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:

  • cursor.scroll(1,mode=‘relative’) # 相对当前位置移动

  • cursor.scroll(2,mode=‘absolute’) # 相对绝对位置移动

2.5 防止SQL注入

#! /usr/bin/env python  
# -*- coding: utf-8 -*-  
# __author__ = "shuke"  
# Date: 2018/5/13  
  
import pymysql  
  
# 创建连接  
conn = pymysql.connect(host="127.0.0.1", port=3306, user='zff', passwd='zff123', db='zff', charset='utf8mb4')  
  
# 创建游标  
cursor = conn.cursor()  
  
# 存在sql注入情况(不要用格式化字符串的方式拼接SQL)  
sql = "insert into USER (NAME) values('%s')" % ('zhangsan',)  
effect_row = cursor.execute(sql)  
  
# 正确方式一  
# execute函数接受一个元组/列表作为SQL参数,元素个数只能有1个  
sql = "insert into USER (NAME) values(%s)"  
effect_row1 = cursor.execute(sql, ['wang6'])  
effect_row2 = cursor.execute(sql, ('wang7',))  
  
# 正确方式二  
sql = "insert into USER (NAME) values(%(name)s)"  
effect_row1 = cursor.execute(sql, {'name': 'wudalang'})  
  
# 写入插入多行数据  
effect_row2 = cursor.executemany("insert into USER (NAME) values(%s)", [('ermazi'), ('dianxiaoer')])  
  
# 提交  
conn.commit()  
# 关闭游标  
cursor.close()  
# 关闭连接  
conn.close()  

这样,SQL操作就更安全了。如果需要更详细的文档参考PyMySQL文档吧。不过好像这些SQL数据库的实现还不太一样,PyMySQL的参数占位符使用%s这样的C格式化符,而Python自带的sqlite3模块的占位符好像是问号(?)。因此在使用其他数据库的时候还是仔细阅读文档吧。

数据库连接池

上文中的方式存在一个问题,单线程情况下可以满足,程序需要频繁的创建释放连接来完成对数据库的操作,那么,我们的程序/脚本在多线程情况下会引发什么问题呢?此时,我们就需要使用数据库连接池来解决这个问题!

3.1 DBUtils模块

DBUtils是Python的一个用于实现数据库连接池的模块。

此连接池有两种连接模式:

  • 为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程再次使用。当线程终止时,连接才会自动关闭

  • 创建一批连接到连接池,供所有线程共享使用(推荐使用)

3.2 模式一

#! /usr/bin/env python  
# -*- coding: utf-8 -*-  
# __author__ = "shuke"  
# Date: 2018/5/13  
  
from DBUtils.PersistentDB import PersistentDB  
import pymysql  
  
POOL = PersistentDB(  
    creator=pymysql,  # 使用链接数据库的模块  
    maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制  
    setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]  
    ping=0,  
    # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always  
    closeable=False,  
    # 如果为False时, conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接(pool.steady_connection()可以获取一个新的链接)  
    threadlocal=None,  # 本线程独享值得对象,用于保存链接对象,如果链接对象被重置  
    host='127.0.0.1',  
    port=3306,  
    user='zff',  
    password='zff123',  
    database='zff',  
    charset='utf8',  
)  
  
  
def func():  
    conn = POOL.connection(shareable=False)  
    cursor = conn.cursor()  
    cursor.execute('select * from USER')  
    result = cursor.fetchall()  
    cursor.close()  
    conn.close()  
    return result  
  
  
result = func()  
print(result)  

3.2 模式二

#! /usr/bin/env python  
# -*- coding: utf-8 -*-  
# __author__ = "shuke"  
# Date: 2018/5/13  
  
import time  
import pymysql  
import threading  
from DBUtils.PooledDB import PooledDB, SharedDBConnection  
  
POOL = PooledDB(  
    creator=pymysql,  # 使用链接数据库的模块  
    maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数  
    mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建  
    maxcached=5,  # 链接池中最多闲置的链接,0和None不限制  
    maxshared=3,  
    # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。  
    blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错  
    maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制  
    setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]  
    ping=0,  
    # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always  
    host='127.0.0.1',  
    port=3306,  
    user='zff',  
    password='zff123',  
    database='zff',  
    charset='utf8'  
)  
  
  
def func():  
    # 检测当前正在运行连接数的是否小于最大链接数,如果不小于则:等待或报raise TooManyConnections异常  
    # 否则  
    # 则优先去初始化时创建的链接中获取链接 SteadyDBConnection。  
    # 然后将SteadyDBConnection对象封装到PooledDedicatedDBConnection中并返回。  
    # 如果最开始创建的链接没有链接,则去创建一个SteadyDBConnection对象,再封装到PooledDedicatedDBConnection中并返回。  
    # 一旦关闭链接后,连接就返回到连接池让后续线程继续使用。  
    conn = POOL.connection()  
  
    # print('连接被拿走了', conn._con)  
    # print('池子里目前有', POOL._idle_cache, '\r\n')  
  
    cursor = conn.cursor()  
    cursor.execute('select * from USER')  
    result = cursor.fetchall()  
    conn.close()  
    return result  
  
  
result = func()  
print(result)  

⚠️ 由于pymysql、MySQLdb等threadsafety值为1,所以该模式连接池中的线程会被所有线程共享,因此是线程安全的。如果没有连接池,使用pymysql来连接数据库时,单线程应用完全没有问题,但如果涉及到多线程应用那么就需要加锁,一旦加锁那么连接势必就会排队等待,当请求比较多时,性能就会降低了。

3.3 加锁

#! /usr/bin/env python  
# -*- coding: utf-8 -*-  
# __author__ = "shuke"  
# Date: 2018/5/13  
  
import pymysql  
import threading  
from threading import RLock  
  
LOCK = RLock()  
CONN = pymysql.connect(host='127.0.0.1',  
                       port=3306,  
                       user='zff',  
                       password='zff123',  
                       database='zff',  
                       charset='utf8')  
  
  
def task(arg):  
    with LOCK:  
        cursor = CONN.cursor()  
        cursor.execute('select * from USER ')  
        result = cursor.fetchall()  
        cursor.close()  
  
        print(result)  
  
  
for i in range(10):  
    t = threading.Thread(target=task, args=(i,))  
    t.start()  

3.4 无锁(报错)

#! /usr/bin/env python  
# -*- coding: utf-8 -*-  
# __author__ = "shuke"  
# Date: 2018/5/13  
  
import pymysql  
import threading  
  
CONN = pymysql.connect(host='127.0.0.1',  
                       port=3306,  
                       user='zff',  
                       password='zff123',  
                       database='zff',  
                       charset='utf8')  
  
  
def task(arg):  
    cursor = CONN.cursor()  
    cursor.execute('select * from USER ')  
    # cursor.execute('select sleep(10)')  
    result = cursor.fetchall()  
    cursor.close()  
    print(result)  
  
  
for i in range(10):  
    t = threading.Thread(target=task, args=(i,))  
    t.start()  

此时可以在数据库中查看连接情况: show status like ‘Threads%’;

数据库连接池结合pymsql使用

# cat sql_helper.py  
  
import pymysql  
import threading  
from DBUtils.PooledDB import PooledDB, SharedDBConnection  
POOL = PooledDB(  
    creator=pymysql,  # 使用链接数据库的模块  
    maxconnections=20,  # 连接池允许的最大连接数,0和None表示不限制连接数  
    mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建  
    maxcached=5,  # 链接池中最多闲置的链接,0和None不限制  
    #maxshared=3,  # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。  
    blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错  
    maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制  
    setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]  
    ping=0,  
    # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always  
    host='192.168.11.38',  
    port=3306,  
    user='root',  
    passwd='apNXgF6RDitFtDQx',  
    db='m2day03db',  
    charset='utf8'  
)  
  
  
def connect():  
    # 创建连接  
    # conn = pymysql.connect(host='192.168.11.38', port=3306, user='root', passwd='apNXgF6RDitFtDQx', db='m2day03db')  
    conn = POOL.connection()  
    # 创建游标  
    cursor = conn.cursor(pymysql.cursors.DictCursor)  
  
    return conn,cursor  
  
def close(conn,cursor):  
    # 关闭游标  
    cursor.close()  
    # 关闭连接  
    conn.close()  
  
def fetch_one(sql,args):  
    conn,cursor = connect()  
    # 执行SQL,并返回收影响行数  
    effect_row = cursor.execute(sql,args)  
    result = cursor.fetchone()  
    close(conn,cursor)  
  
    return result  
  
def fetch_all(sql,args):  
    conn, cursor = connect()  
  
    # 执行SQL,并返回收影响行数  
    cursor.execute(sql,args)  
    result = cursor.fetchall()  
  
    close(conn, cursor)  
    return result  
  
def insert(sql,args):  
    """  
    创建数据  
    :param sql: 含有占位符的SQL  
    :return:  
    """  
    conn, cursor = connect()  
  
    # 执行SQL,并返回收影响行数  
    effect_row = cursor.execute(sql,args)  
    conn.commit()  
  
    close(conn, cursor)  
  
def delete(sql,args):  
    """  
    创建数据  
    :param sql: 含有占位符的SQL  
    :return:  
    """  
    conn, cursor = connect()  
  
    # 执行SQL,并返回收影响行数  
    effect_row = cursor.execute(sql,args)  
  
    conn.commit()  
  
    close(conn, cursor)  
  
    return effect_row  
  
def update(sql,args):  
    conn, cursor = connect()  
  
    # 执行SQL,并返回收影响行数  
    effect_row = cursor.execute(sql, args)  
  
    conn.commit()  
  
    close(conn, cursor)  
  
    return effect_row  

PS: 可以利用静态方法封装到一个类中,方便使用

关于Python学习指南

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

点击免费领取《CSDN大礼包》:Python入门到进阶资料 & 实战源码 & 兼职接单方法 安全链接免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1064020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring基础以及核心概念(IoC和DIQ)

1.Spring是什么 Spring是包含了众多工具方法的IoC容器 2.loC(Inversion of Control )是什么 IoC:控制反转,Spring是一个控制反转容器(控制反转对象的生命周期) Spring是一个loC容器,我们之前学过的List/Map就是数据存储的容器,to…

大数据Doris(五):开始编译 Doris

文章目录 开始编译 Doris 一、下载Doris的安装包 二、解压缩 三、上传配置文件

linux常见命令以及jdk,tomcat环境搭建

目录 Is pwd cd touch cat echo vim 复制粘贴 mkdir rm cp jdk部署 1. yum list | grep jdk进行查找​编辑 2.安装​编辑 3.再次确认 4.判断是否安装成功 tomcat安装 1.下载压缩包,把压缩包上传至linux(可能需要yum install lrzsz) 2.解压缩unzip 压缩包名&…

❓“想创作音乐,但不会编曲?”FL Studio 21 轻松帮你编曲

❓“想创作音乐,但不会编曲?” ❓“不知道如何将各种音乐元素组合起来?” 5个步骤,轻松编曲! 想要成为音乐创作高手,编曲是必不可少的技能。今天为大家带来5个编曲的步骤,让你轻松掌握编曲技巧…

[论文工具] LaTeX论文撰写常见用法及实战技巧归纳(持续更新)

祝大家中秋国庆双节快乐! 回过头来,我们在编程过程中,经常会遇到各种各样的问题。然而,很多问题都无法解决,网上夹杂着各种冗余的回答,也缺乏系统的实战技巧归纳。为更好地从事科学研究和编程学习&#xff…

GEE错误——Line 2: ee.Image(...).filterBounds is not a function

错误: 我正在尝试通过应用过滤器绑定和过滤器日期来提取多个区域的平均碳含量。我得到的错误是:filterbound 不是一个函数。 我认为问题在于我使用的是 ee.Image 而不是 ee.ImageCollection。我知道如何解决这个问题吗?谢谢 这里的代码&am…

字符串和内存函数

目录 strlen 模拟实现 长度不受限字符串函数 strcpy 模拟实现 ​编辑 strcat 模拟实现 strcmp 模拟实现 长度受限字符串函数 strncpy 模拟实现 strncat strncmp strstr 模拟实现 strtok strerror perror 字符分类函数 字符转换 示例: ​编辑内…

10.4 认识Capstone反汇编引擎

Capstone 是一款开源的反汇编框架,目前该引擎支持的CPU架构包括x86、x64、ARM、MIPS、POWERPC、SPARC等,Capstone 的特点是快速、轻量级、易于使用,它可以良好地处理各种类型的指令,支持将指令转换成AT&T汇编语法或Intel汇编语…

C++:模板进阶与继承

模板进阶与继承 模板进阶1.非类型的模板参数2.模板的特化2.1特化的概念2.2函数模板特化2.3类模板特化2.4全特化和偏特化2.4.1全特化2.4.2偏特化 3.模板的分离编译3.1同文件分离3.2不同文件下分离 继承1.继承的概念和定义1.1继承的概念1.2继承的定义1.2.1定义格式1.2.2继承关系和…

哈希应用之位图

文章目录 1.位图概念2.面试题引入3.代码解决[配注释]4.位图应用4.1找到100亿个整数里只出现一次的整数4.2找两个分别有100亿个整数的文件的交集[只有1G内存]1.法一[使用于数据量<42亿]2.法二[适用于数据量大>42亿]3.在一个有100亿个int的文件中找到出现次数不超过2次的所…

自动驾驶技术的基础知识

自动驾驶技术是现代汽车工业中的一项革命性发展&#xff0c;它正在改变着我们对交通和出行的理解。本文将介绍自动驾驶技术的基础知识&#xff0c;包括其概念、历史发展、分类以及关键技术要素。 1. 自动驾驶概念 自动驾驶是一种先进的交通技术&#xff0c;它允许汽车在没有人…

字符集、编码格式的理解

计算机中只能存储二进制01&#xff0c; 要想存储字符&#xff0c;就要有一个字符与编码的映射关系&#xff0c;这个关系就是字符集。 字符集就是字符与编码的映射关系* 字符集的发展历程&#xff1a; 因为计算机是欧美先发明的&#xff0c;他们的语言就26个字母&#xff0c;所…

MyBatis-plus使用

1 基础介绍 MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 它已经封装好了一些crud方法&#xff0c;我们不需要再写…

速学数据结构 | 手把手教你会单链表的构建方式

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《初阶数据结构》《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言1. 什么是链表1.1 链表的物理结构1.2 链表的种类 2. 链表的实现一. SList.h 单链表的声明3.…

10. 激光雷达到车身坐标系外参的标定方法(lidar2car)

目录 0. 论文及代码1. 标定原理2. 拟合平面3. 标定roll/pitch/height4. 标定yaw4.1 理解从B_spline拟合的轨迹中得到vehicle航向 5. 精度 0. 论文及代码 参考论文&#xff1a;SensorX2car: Sensors-to-car calibration for autonomous driving in road scenarios 参考代码&…

kafka初体验基础认知部署

kafka 基础介绍 Apache Kafka是一个分布式流处理平台&#xff0c;最初由LinkedIn开发并于2011年开源。它主要用于解决大规模数据的实时流式处理和数据管道问题。 Kafka是一个分布式的发布-订阅消息系统&#xff0c;可以快速地处理高吞吐量的数据流&#xff0c;并将数据实时地分…

医院PACS系统源码 PACS系统源码

医用软件中的影像归档与传输系统软件&#xff08;Picture Archiving and Communication System&#xff0c;简称PACS&#xff09;是一种用于存储、管理和传输医学影像数据的系统。其主要功能包括&#xff1a; 影像存储&#xff1a;PACS可以将医学影像数据以数字化的形式存储在服…

YoloV8训练自己的模型 Pycharm Remote Development

参考视频&#xff1a;https://www.youtube.com/watch?vm9fH9OWn8YM YOLO官方网站&#xff1a;GitHub - ultralytics/ultralytics: NEW - YOLOv8 &#x1f680; in PyTorch > ONNX > OpenVINO > CoreML > TFLite 在本地的pycharm上面建立一个项目 使用scp把代码传…

星球作业(第十一期)Android中Binder简述

Binder 什么是binder&#xff1f;简述下它的工作过程和使用场景。 什么是Binder&#xff1f; Binder是Android中的一个类&#xff0c;实现了IBinder接口&#xff1b; 从IPC的角度来说&#xff0c;Binder是Android中的一种通讯方式&#xff1b; 从Android Framework角度来说&a…