Python更新数据库脚本两种方法及对比介绍
本文对比了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更新数据库脚本的两种主要方法及其对比分析,希望能对大家有所帮助。如有任何疑问,欢迎留言交流,小编会及时回复。同时,非常感谢大家对本站的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









