有客自远方来52 2024-05-08 23:13 采纳率: 15.3%
浏览 0
已结题

为什么会出现查询错误的问题?(语言-python)

以下是我的代码,为什么会出现查询错误的问题,该怎么解决

def list(cea: Cea):
    """
    根据条件查询图书信息
    :param Hbook: 查询参数
    :return:
    """
    con = None
    try:
        con = dbUtil.getCon()
        cursor = con.cursor()
        # 查询数据
        sql = "SELECT c.Cuser,c.Cname,c.Cage,c.Csex,c.Cphone,c.Caddress,c.Caddtime,g.Gname FROM Crew AS c,Groups AS g WHERE c.GID=g.GID AND CID=CID"
        if cea != None:
            if cea.Cuser.strip() != '':
                sql += " and c.Cuser like '%" + cea.Cuser + "%' "
            if cea.Cname.strip() != '':
                sql += " and c.Cname like '%" + cea.Cname + "%' "
            if cea.GID != -1:
                sql += " and g.GID = " + str(cea.GID)

        cursor.execute(sql)
        con.commit()
        return cursor.fetchall()
    except Exception as e:
        print(f"123查询数据时发生错误: {e}")
        if con is not None:
            con.rollback()
        return None
    finally:
        dbUtil.closeCon(con)


123查询数据时发生错误: (207, b"Invalid column name 'None'.DB-Lib error message 20018, severity 16:\nGeneral SQL Server error: Check messages from the SQL Server\n")

  • 写回答

2条回答 默认 最新

  • 专家-皆知 2024-05-08 23:14
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    在提供的Python代码中,查询错误是因为SQL语句中可能包含了未定义的列名None。这通常发生在cea对象中的某个属性没有被初始化或者值为None,并且尝试在SQL语句中拼接这个属性时,导致了空字符串''None一起被插入到SQL语句中。

    为了解决这个问题,我们需要确保只有当属性有值且不为空时才将其添加到SQL语句中。我们可以使用逻辑运算符andor来实现这一目的。同时,为了防止SQL注入攻击,建议使用参数化查询方式执行SQL语句。以下是修改后的代码:

    import sqlite3
    
    # 假设dbUtil.getCon()返回一个SQLite连接对象
    def list(cea: object):
        """
        根据条件查询图书信息
        :param cea: 查询参数
        :return:
        """
        conn = None
        try:
            conn = dbUtil.getCon()
            cursor = conn.cursor()
    
            # 初始化SQL语句
            base_sql = "SELECT c.Cuser,c.Cname,c.Cage,c.Csex,c.Cphone,c.Caddress,c.Caddtime,g.Gname FROM Crew AS c,Groups AS g WHERE c.GID=g.GID"
    
            # 构建WHERE子句
            where_clauses = []
            params = []
    
            # 检查并添加Cuser条件
            if cea.Cuser.strip() != '':
                where_clauses.append("c.Cuser LIKE ?")
                params.append("%" + cea.Cuser + "%")
    
            # 检查并添加Cname条件
            if cea.Cname.strip() != '':
                where_clauses.append("c.Cname LIKE ?")
                params.append("%" + cea.Cname + "%")
    
            # 检查并添加GID条件
            if cea.GID != -1:
                where_clauses.append("g.GID = ?")
                params.append(str(cea.GID))
    
            # 如果有WHERE子句,则将其添加到SQL语句中
            if len(where_clauses) > 0:
                base_sql += " AND " + " AND ".join(where_clauses)
    
            cursor.execute(base_sql, tuple(params))
            conn.commit()
            return cursor.fetchall()
        except sqlite3.Error as e:
            print(f"123查询数据时发生错误: {e}")
            if conn is not None:
                conn.rollback()
            return None
        finally:
            if conn is not None:
                conn.close()
    

    这段代码首先创建了一个基础的SQL查询语句,并根据传入的cea对象动态构建WHERE子句。这里我们使用了参数化查询,这样可以有效地防止SQL注入攻击,并且解决了因None导致的查询错误问题。注意,这里的数据库连接库已经更改为sqlite3,因为原始代码片段中的错误提示是针对SQL Server的,而SQL Server与SQLite的语法稍有不同。如果你使用的是其他数据库(例如MySQL、PostgreSQL等),则需要相应地调整代码。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月9日
  • 创建了问题 5月8日

悬赏问题

  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊
  • ¥15 求多普勒频移瞬时表达式
  • ¥15 如果要做一个老年人平板有哪些需求