如何用python连接mysql数据库

这是一个坑。
MySQLdb 模块不支持 Python 3 .x。
不要相信官方文件。
不要这样做。

实用提醒:请使用 PyMySQL 代替。

如何使用python连接mysql数据库

嘿嘿,说一下Python连接MySQL数据库的过程,真的很有趣。
我在实践中已经做过很多次了,现在详细告诉大家。

首先,你看到的代码实际上使用了mysql-connector-python库来连接数据库。
这个东西是一个相当于翻译器的驱动程序,负责将你的Python代码翻译成MySQL服务器可以理解的语句。

当时我在一个项目中使用了这个库,它连接到了公司的内部数据库。
我记得当时使用的IP是1 7 2 .1 6 .1 9 2 .1 00,端口是3 3 06 ,用户名和密码是appuser和xxxxxx。
这就像您的姓名和密码,用于证明您是谁。

当执行此代码时,驱动程序将启动到 MySQL 服务器的 TCP 连接。
这个过程有点像给朋友打电话。
你得先打个电话,然后才能说话。

连接建立后,双方开始交换信息。
首先MySQL服务器发送握手包,就像对方接听电话后介绍自己一样。
这个握手包包含服务器版本信息、默认授权插件和密码的salt值,以及您的个人信息和您的加密密码。

接下来,客户端根据需要发送SSL连接请求数据包。
这相当于要求您对通话进行加密,以确保隐私和安全。

然后客户端发送一个握手响应包,其中包含用户名、加密的密码字符串、客户端属性等信息,就好像它在告诉对方你是谁,你想做什么。

最后MySQL服务器发送响应包告诉客户端登录是否成功。
如果成功,就可以开始正式沟通;如果失败,服务器也会发出错误消息,就像对方一样,告诉你拨错号码。

整个过程其实就像一次在线对话。
通过握手、交换信息,双方完成认证和连接。
虽然听起来很复杂,但是这个库实际上已经封装了一切,我们只需要根据它的需要传递参数即可。

您提供的MySQL协议链接描述了所有通信的格式和顺序。
如果你有兴趣,你可以亲自看看。
但说实话,了解这些底层细节对于大多数开发人员来说并不是必要的。
毕竟,我们只需要能够使用它们即可。

MySQL如何与Python实现高效数据交互 MySQL连接Python的ORM框架对比与实战

那时是 2 02 2 年,我在与 Python 和 MySQL 交互时真的很困难。
至于连接方式,mysql-connector-python不错,官方的,稳定,不过我用PyMySQL比较多。
安装速度很快。
只需安装 pip 即可完成。
当你赶时间的时候这很容易。
对于连接池,mysql.connector.pooling 可以,或者 DBUtils 也可以。
但是,不要一直打开新连接,这很昂贵。

SQL语句的优化,这个很重要。
以前都是写批量插入,然后一条一条的跑,速度很慢。
然后我学会了使用executemany,它变得更加高效。
对于大数据量的操作,需要分页,否则内存会爆炸。
到 2 02 2 年,服务器内存只会那么小,不像现在有大量内存可用。
索引,这个东西得加上,如果不变成全表扫描的话,真的很慢。
不要使用SELECT来检查字段,指定字段以节省流量。

数据处理、大数据集、批量处理、一次1 000个项目等等,这是正常的。
流式处理采用服务器端游标逐行读取,非常适合内存较小的场景。

ORM框架,我尝试过SQLAlchemy。
它功能齐全,但感觉很重,有时还很慢。
Peewee 轻量级且易于编写,非常适合小型项目和快速开发。
2 02 2 年的一个小项目上用过Peewee,感觉还可以。
对于大型项目,SQLAlchemy可能更容易并且具有很多功能。

安全,SQL注入必须防范。
参数化查询,你要记住这一点,不要放硬字符串,这是有风险的。
之前我就犯过直接输入用户输入的错误,但是被老板骂了之后,我改用了参数化。

对于监控,使用 SHOW STATUS 查看状态,使用 SHOW PROCESS LIST 查看谁在忙什么。
后来我用了Prometheus+Grafana,感觉更直观。
QPS、TPS、慢查询等一切一目了然。
当时我从未使用过 Percona Toolkit,但我听说它非常酷。

一般来说,项目规模、团队经验和绩效要求都必须考虑。
一个小型 Peewee 项目或直接 SQL。
SQLAlchemy 的大项目。
如果团队熟悉 ORM,他们就会使用它;如果他们不熟悉,他们就会写SQL。
性能关键路径、直接 SQL 访问和优化索引。
就这样,我通过反复试验想出了它。

如何用python进行mysql的数据更新(大批量)?

说实话,之前我已经用Python做过很多次MySQL的批量更新了,确实很方便。
不过,有些细节你得注意,不然很容易出麻烦。

比如我上次更新了几百条数据的时候,直接用ExecuteMany查看,发现服务器直接挂了——要知道,数据库压力太大了。
前几天我看进度条,CPU 到了 2 00%。
说实话,还是挺激动的。
后来吸取教训,分批更新,每批1 000条,加上sleep(0.1 ),现在稳定多了。

另一个威胁是数据格式。
我有一个使用 pymysql 库的项目,它与 mysql.connector 存在兼容性问题。
我记得有一次我将字典传递给 ExecuteMenu 时,报告错误“数据类型不匹配”。
我当时就一头雾水,找了半天,发现pymysql的占位符是%s,但是有些情况下,应该用%(name)s的形式来代替。
这让我明白,不同的库之间还是存在差异的。

还有一次更新用户表忘记加WHERE条件,所以直接把所有用户名都改成了“张三”。
幸运的是,我先在测试环境中运行了它,当我发现有问题时立即退出。
因此,在写SQL语句的时候,要注意那些占位符是否乱了。

回到性能优化,我尝试调整事务大小。
然而小批量更新安全,但效率低下;大批量更新虽然高效,但服务器无法处理。
根据我的经验,对于数百万的数据,分成2 0-3 0个批次比较合适。
当然,这取决于您的具体服务器配置。
这只是我的个人经历。

顺便说一句,记住 conn.commit。
不要忘记。
上次忘记提交了,但是数据库没有任何变化。
当时我的手在颤抖,我立即撤回了手术。

简而言之,用Python更新MySQL数据的关键是把细节搞对。
代码在完成之前才算完成。
这要看实际效果。
这才是真正的技巧。