人家的Python数据库连接类和sql语句拼接方法

本文介绍了一种用于生成SQL语句的方法,并提供了一个实用的数据库连接类及查询结果解析方法。通过简单的函数调用即可实现SQL的增删改查操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文出处:

https://www.cnblogs.com/Xjng/p/3821827.html

sql拼接方法

复制代码

# encoding=utf-8
from django.http import HttpResponse
from anyjson import serialize
from django.http import HttpResponse
from anyjson import serialize
import MySQLdb


def safe(s):
    return MySQLdb.escape_string(s)


def get_i_sql(table, dict):
    '''
    生成insert的sql语句
    @table,插入记录的表名
    @dict,插入的数据,字典
    '''
    sql = 'insert into %s set ' % table
    sql += dict_2_str(dict)
    return sql


def get_s_sql(table, keys, conditions, isdistinct=0):
    '''
        生成select的sql语句
    @table,查询记录的表名
    @key,需要查询的字段
    @conditions,插入的数据,字典
    @isdistinct,查询的数据是否不重复
    '''
    if isdistinct:
        sql = 'select distinct %s ' % ",".join(keys)
    else:
        sql = 'select  %s ' % ",".join(keys)
    sql += ' from %s ' % table
    if conditions:
        sql += ' where %s ' % dict_2_str_and(conditions)
    return sql


def get_u_sql(table, value, conditions):
    '''
        生成update的sql语句
    @table,查询记录的表名
    @value,dict,需要更新的字段
    @conditions,插入的数据,字典
    '''
    sql = 'update %s set ' % table
    sql += dict_2_str(value)
    if conditions:
        sql += ' where %s ' % dict_2_str_and(conditions)
    return sql


def get_d_sql(table, conditions):
    '''
        生成detele的sql语句
    @table,查询记录的表名

    @conditions,插入的数据,字典
    '''
    sql = 'delete from  %s  ' % table
    if conditions:
        sql += ' where %s ' % dict_2_str_and(conditions)
    return sql


def dict_2_str(dictin):
    '''
    将字典变成,key='value',key='value' 的形式
    '''
    tmplist = []
    for k, v in dictin.items():
        tmp = "%s='%s'" % (str(k), safe(str(v)))
        tmplist.append(' ' + tmp + ' ')
    return ','.join(tmplist)


def dict_2_str_and(dictin):
    '''
    将字典变成,key='value' and key='value'的形式
    '''
    tmplist = []
    for k, v in dictin.items():
        tmp = "%s='%s'" % (str(k), safe(str(v)))
        tmplist.append(' ' + tmp + ' ')
    return ' and '.join(tmplist)

复制代码

 

数据库连接类

复制代码

class SqlConn():
    def __init__(self):
        self.conn= DBpool.pool.connection()
        self.cur=self.conn.cursor()
    def cur(self):
        return self.cur()
    def commit(self):
        self.conn.commit()
    def execute(self,sql,fetchone=0):
        self.cur.execute(sql)
        return self.cur.fetchone() if fetchone else self.cur.fetchall()
    def last_id(self,table):
        sql='SELECT LAST_INSERT_ID() from %s'%table
        return self.execute(sql,1)[0]
    def close(self):
        self.cur.close()
        self.conn.close()

复制代码

self.conn= DBpool.pool.connection()
中,我用的是连接池连接,这里可以改成普通的数据库连接

查询结果解析方法

复制代码

def fSqlResult(r,key_list):
    #r @tuple 数据库fetchall的结果
    #key_list @list 查询字段的keys
    # format SQL Result 格式化数据库查询的结果,转化成包含多个字典的列表格式,即((1,2),(3,4))->[{"key1":1,"key2":2},{"key1":3,"key2":4}]
    #返回 @dict 查询结果
    mlist=[]
    l=len(key_list)
    if r:
        for item in r:
            tmp={}
            for i in range(l):
                tmp[key_list[i]]=str(item[i])
            mlist.append(tmp)
    return mlist

复制代码

使用方法:

例如要执行sql语句:select username,pwd,type,age,birth from user where username='abc';

conn=SqlConn()
key_list=['username','pwd','type','age','birth']
sql=s_sql('user',key_list,{'username':'abc'}
r=conn.execute(sql)
data=fSqlResult(r,key_list)
conn.close()

data的格式为[{'username':'i am username','pwd':'i am pwd','type':'student','age':12,'birth':'2014-7-2'}]
方便快捷,适用于经常需要用到数据库的CRUD连接的应用。

<think>好的,用户之前已经询问过关于Python中connect()函数的使用,特别是连接数据库的相关内容。现在用户的新问题是关于如何用Python链接MySQL数据库并执行SQL语句。我需要先回顾之前的回答,确保这次回答不重复,同时补充具体的执行SQL步骤。 首先,用户可能已经了解connect()的基本用法,但这次需要更详细的操作步骤,包括连接后的执行语句流程。需要明确的是,用户可能需要一个从连接到执行查询的完整示例,包括如何插入、查询数据以及错误处理。 接下来,我要考虑用户可能的实际应用场景。可能是开发一个需要与MySQL交互的Python应用,比如Web后端或者数据处理脚本。用户可能对数据库操作不太熟悉,所以需要详细说明每一步骤,包括导入库、建立连接、创建游标、执行SQL、提交事务关闭连接。 另外,用户可能关心异常处理资源管理,比如如何避免连接泄漏,确保即使在出错的情况下也能正确关闭连接。所以在回答中需要包含try-except块finally子句的使用,或者推荐使用上下文管理器(with语句),这在之前的回答中也提到过,但需要在这里再次强调。 还需要注意不同驱动的兼容性。比如,用户可能使用pymysql或者mysql-connector-python,两者的参数可能略有不同,但基本步骤相似。可能需要指出不同驱动之间的差异,但为了简洁,可以统一使用pymysql作为示例,并提到其他可选驱动。 此外,用户可能对SQL注入不太了解,所以示例中应该使用参数化查询,而不是字符串拼接,以提高安全性。需要强调这一点,避免用户在实际应用中出现安全漏洞。 最后,考虑到用户可能需要实际操作,示例代码应该完整且可运行,包括必要的占位符替换,如主机名、用户名、密码、数据库名等。同时,执行查询后的结果获取方式也需要说明,比如使用fetchone()、fetchall()等方法。 总结起来,回答的结构应该是:导入库、建立连接、创建游标、执行SQL(包括增删改查)、处理异常、关闭连接。每个步骤给出代码示例解释,并附上完整示例。同时,强调安全性资源管理的重要性。</think>以下是使用Python连接MySQL数据库并执行SQL语句的完整指南: --- ### 一、准备工作 1. **安装驱动**(任选其一) ```bash # 使用PyMySQL驱动 pip install pymysql # 或使用官方驱动 pip install mysql-connector-python ``` 2. **创建测试表** ```sql CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE ); ``` --- ### 二、基础操作流程 #### 1. 建立连接 ```python import pymysql # 基础连接配置 conn = pymysql.connect( host='localhost', # 数据库服务器地址 user='your_username',# 数据库用户名 password='your_password', database='your_database', charset='utf8mb4', # 推荐字符集 port=3306, # 默认MySQL端口 cursorclass=pymysql.cursors.DictCursor # 返回字典格式数据 ) ``` #### 2. 创建游标对象 ```python cursor = conn.cursor() # 获取操作游标 ``` #### 3. 执行SQL语句 **👉 查询操作示例** ```python try: # 参数化查询(防SQL注入) sql = "SELECT * FROM users WHERE name = %s" cursor.execute(sql, ('张三',)) # 获取结果 results = cursor.fetchall() for row in results: print(f"ID: {row['id']}, 姓名: {row['name']}") except pymysql.Error as e: print(f"查询错误: {str(e)}") ``` **👉 插入/更新操作** ```python try: insert_sql = """ INSERT INTO users (name, email) VALUES (%s, %s) """ cursor.execute(insert_sql, ('李四', 'lisi@example.com')) conn.commit() # 必须显式提交事务 print("插入成功,影响行数:", cursor.rowcount) except pymysql.IntegrityError as e: conn.rollback() # 唯一约束等错误回滚 print("违反唯一约束:", str(e)) ``` --- ### 三、完整示例代码 ```python import pymysql def mysql_operation(): conn = None try: # 建立连接 conn = pymysql.connect( host='localhost', user='root', password='mypassword', database='test_db', charset='utf8mb4' ) # 使用上下文管理器管理游标 with conn.cursor() as cursor: # 插入数据 cursor.execute( "INSERT INTO users (name, email) VALUES (%s, %s)", ('王五', 'wangwu@example.com') ) # 查询验证 cursor.execute("SELECT LAST_INSERT_ID() AS new_id") new_id = cursor.fetchone()['new_id'] print(f"新记录ID: {new_id}") conn.commit() # 提交事务 except pymysql.MySQLError as e: print(f"数据库错误: {e}") if conn: conn.rollback() finally: if conn: conn.close() # 确保连接关闭 print("连接已关闭") if __name__ == "__main__": mysql_operation() ``` --- ### 四、高级技巧 #### 1. 批量插入数据 ```python data = [ ('张三', 'zhangsan@test.com'), ('李四', 'lisi@test.com'), ('王五', 'wangwu@test.com') ] cursor.executemany( "INSERT INTO users (name, email) VALUES (%s, %s)", data ) conn.commit() ``` #### 2. 获取自增ID ```python cursor.execute("INSERT ...") new_id = cursor.lastrowid # 直接获取自增ID ``` #### 3. 事务管理 ```python try: cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE id=1") cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE id=2") conn.commit() # 同时成功才提交 except: conn.rollback() # 任意失败则回滚 ``` --- ### 五、常见错误处理 | 错误型 | 触发场景 | 解决方案 | |--------------------------|--------------------------|------------------------------| | `OperationalError` | 连接参数错误/网络中断 | 检查连接参数,验证网络连通性 | | `ProgrammingError` | SQL语法错误 | 使用SQL客户端验证语句合法性 | | `IntegrityError` | 违反唯一约束/外键约束 | 添加异常处理,回滚事务 | | `DataError` | 数据型不匹配 | 检查插入数据格式 | --- ### 六、性能优化建议 1. **连接池管理**:使用`DBUtils`库实现连接复用 2. **批量操作**:优先使用`executemany()`代替单条插入 3. **索引优化**:对WHERE条件字段建立索引 4. **查询缓存**:对频繁读取且不常变的数据使用缓存机制 --- ### 七、安全注意事项 1. **参数化查询**:永远不要拼接SQL字符串 ```python # 危险做法 ❌ cursor.execute(f"SELECT * FROM users WHERE name = '{user_input}'") # 正确做法 ✅ cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,)) ``` 2. **最小权限原则**:数据库账号只授予必要权限 3. **加密连接**:生产环境使用SSL连接 ```python conn = pymysql.connect( ..., ssl={'ca': '/path/to/ca.pem'} ) ``` --- 通过以上步骤,您可以安全高效地在Python中操作MySQL数据库。实际开发中建议结合ORM框架(如SQLAlchemy)进行更高级的数据库操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值