Python更新数据库脚本两种方法及对比介绍

小石头
小石头
发布时间:2026-10-13 | 2人浏览过
原创

本文对比了Python中更新数据库的两种常用方法:使用MySQLdb模块执行原生SQL语句,以及基于Flask框架结合SQLAlchemy ORM进行数据操作。通过实际代码示例展示了两种方式的实现细节,并分析了在项目已有SQLAlchemy函数的情况下,采用ORM方式能避免重复开发、提高维护效率的优势,建议Flask项目优先使用第二种方法。

在最近项目的两次版本迭代中,随着业务需求的调整,我们需要对数据库结构或数据进行更新。在这两次迭代中,我们分别尝试了不同的技术路径来完成数据库的更新工作。

第一种方案:利用Python的MySQLdb模块,直接编写并执行原生的SQL语句来实现数据库更新。

import MySQLdb
#主机名
HOST = '127.0.0.1'
#用户名
USER = "root"
#密码
PASSWD = "123456"
#数据库名
DB = "db_name"
# 打开数据库连接
db=MySQLdb.connect(HOST,USER,PASSWD,DB)
# 获取操作游标
cursor=db.cursor()
if __name__ == '__main__':
  if cursor:
    command_a = "update tables_one set status=5 where status=0"
    # 使用execute方法执行SQL语句
    cursor.execute(command_a)
    # 提交到数据库执行
    db.commit()
    command2 = "select field from tables_one where id =12"
    ret2 = cursor.execute(command2)
    # 获取所有记录列表
    ret2=cursor.fetchall()
    for item in ret2:
        command3 = "insert into tables_two(name) values (%s);" % (item[0])
        fin=cursor.execute(command3)
        db.commit()
    # 关闭数据库连接
    db.close()

在涉及数据库查询操作时,通常有三种主要的数据获取方式:

  • fetchone():用于获取查询结果集中的下一条记录,返回的是一个包含数据的对象。
  • fetchall():用于一次性接收并返回查询结果集中的所有剩余记录行。
  • rowcount:这是一个只读属性,用于返回最后一次执行execute()方法所影响的行数。

第二种方案:基于Python的Flask框架,结合SQLAlchemy库来进行数据库的更新操作。

# -*- coding:utf-8 -*-
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.sql import text
HOST = '127.0.0.1'
USER = "root"
PASSWD = "123456"
DB = "carrier_test"
CHARTSET = "utf8"
app = Flask(__name__,instance_relative_config = True)
#链接数据库路径
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://%s:%s@127.0.0.1:3306/%s?charset=%s' %(USER,PASSWD,DB,CHARTSET)
#如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
#如果设置成 True,SQLAlchemy 将会记录所有 发到标准输出(stderr)的语句,这对调试很有帮助。
app.config['SQLALCHEMY_ECHO'] = False
# 数据库连接池的大小。默认是数据库引擎的默认值 (通常是 5)。
app.config['SQLALCHEMY_POOL_SIZE'] = 6
db = SQLAlchemy(app)
class Table_one(db.Model):
  __tablename__ = 'table_one'
  id = db.Column('id', db.Integer, primary_key=True, autoincrement=True)
  com_name = db.Column('com_name', db.String(30), nullable=False)
  com_about = db.Column('com_about', db.String(200), nullable=False)
  def __repr__(self):
    return '<table_one com_name %r>' % self.com_name
class Table_two(db.Model):
  __tablename__ = 'table_two'
  id = db.Column('id', db.Integer, primary_key=True, autoincrement=True)
  reason = db.Column('reason', db.String(128), nullable=True)
  create_time = db.Column('create_time', db.TIMESTAMP, server_default=text('now()'))
  status = db.Column('status', db.Integer, nullable=False, default=0)
  def __repr__(self):
    return '<table_two id %r>' % self.id
def db_commit_all(lists):
  try:
    db.session.add_all(lists)
    db.session.commit()
    return 'SUCCESS'
  except Exception,e:
    return 'Fail!!!'
def commits_to_three_judge():
  com_sta_obj = Table_one.query.filter_by(com_name='只是测试使用,不用关心表间关系').all()
  for ite in com_sta_obj:
    ship_obj = Table_two.query.filter_by(id=ite.id).first()
    if ship_obj:
      if int(ship_obj.status) == 2:
        ite.status = 0
        print db_commit_all([ite])
  print '表同步结束'
64 
if __name__=='__main__':
  #执行更新数据库函数
  commits_to_three_judge()

以下是对上述两种更新方式的详细对比:

1. 在实际项目场景中,数据库更新往往涉及复杂的数据收集、条件判断等逻辑。如果项目中已经广泛使用SQLAlchemy进行数据交互(例如第二种方法中提到的db_commit_all()函数),那么直接复用这些现有函数会更为便捷。

2. 采用第二种方法时,只需将项目中已有的相关函数复制到更新脚本中即可直接使用。相比之下,若使用第一种方法,则需要重新编写相关的辅助函数,这不仅增加了开发时间,也消耗了额外的精力。

3. 如果项目本身是基于Flask框架开发的,强烈推荐使用第二种方法进行数据库更新,以保持代码风格和技术栈的一致性。

总结

以上介绍了Python更新数据库脚本的两种主要方法及其对比分析,希望能对大家有所帮助。如有任何疑问,欢迎留言交流,小编会及时回复。同时,非常感谢大家对本站的支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表