Python中数据库查询数据问题如何解决?

id  pid  type
1    1    2
2    1    7
3    1    8
4    2    8
5    3    7
6    3    8

表结构如上。
pid 与 id 没有任何关系
取出来这两种数据:
1。pid 为 2 的,因为 type 只等于 8
2。pid 为 3 的,因为 type 只有等与 7 与等于 8 的
注:pid 为 1 的不需要,因为有一个 type=2,所以不取。


Python中数据库查询数据问题如何解决?

11 回复

完全不知道在说啥。。


帖子标题:Python中数据库查询数据问题如何解决?

这个问题太宽泛了,数据库查询出问题原因很多。我直接给你一个最常用、最完整的解决方案模板,覆盖了连接、查询、异常处理和资源释放。这里以sqlite3为例,其他数据库(如MySQLPostgreSQL)只需替换连接方式,核心逻辑完全一样。

import sqlite3
import pandas as pd  # 可选,用于结果转DataFrame

def query_database(db_path, sql_query, params=None):
    """
    执行数据库查询的通用函数
    
    Args:
        db_path: 数据库路径(或连接字符串)
        sql_query: SQL查询语句
        params: 查询参数(防止SQL注入)
    
    Returns:
        list: 查询结果列表
    """
    connection = None
    cursor = None
    results = []
    
    try:
        # 1. 建立数据库连接
        connection = sqlite3.connect(db_path)
        
        # 2. 创建游标
        cursor = connection.cursor()
        
        # 3. 执行查询(使用参数化查询防止SQL注入)
        if params:
            cursor.execute(sql_query, params)
        else:
            cursor.execute(sql_query)
        
        # 4. 获取所有结果
        results = cursor.fetchall()
        
        # 5. 获取列名(可选)
        column_names = [description[0] for description in cursor.description]
        print(f"列名: {column_names}")
        
        # 6. 打印结果(调试用)
        for row in results:
            print(row)
            
        # 7. 如果想转成pandas DataFrame(可选)
        # df = pd.DataFrame(results, columns=column_names)
        # print(df)
        
        return results
        
    except sqlite3.Error as e:
        print(f"数据库错误: {e}")
        return []
        
    except Exception as e:
        print(f"其他错误: {e}")
        return []
        
    finally:
        # 8. 确保关闭游标和连接
        if cursor:
            cursor.close()
        if connection:
            connection.close()

# 使用示例
if __name__ == "__main__":
    # 示例1:简单查询
    results = query_database(
        "example.db",
        "SELECT * FROM users WHERE age > ?",
        (18,)  # 参数化查询
    )
    
    # 示例2:带多个参数的查询
    results2 = query_database(
        "example.db",
        "SELECT * FROM products WHERE category = ? AND price < ?",
        ("electronics", 1000)
    )

常见问题排查点:

  1. 连接问题:检查数据库路径/连接字符串是否正确
  2. SQL语法错误:先在数据库客户端测试SQL语句
  3. 参数传递:一定要用参数化查询(?%s占位符),不要用字符串拼接
  4. 结果获取fetchall()获取所有行,fetchone()获取单行,fetchmany(n)获取n行
  5. 资源泄漏:确保在finally块中关闭连接

如果你遇到具体错误:

  • 报错信息贴出来
  • 你的SQL语句是什么
  • 用的什么数据库和驱动

一句话建议:先确保SQL语句在数据库客户端能单独运行成功,再用Python执行。

完全不知道在说啥。。

语文不及格。

额所以问题呢?

表达的很不准确

1。pid 为 2 的,因为 type 只等于 8
// pid=2 和 type=8 有什么逻辑关系?

2。pid 为 3 的,因为 type 只有等与 7 与等于 8 的
// pid=3 和 type=7/8 又是什么逻辑关系

注:pid 为 1 的不需要,因为有一个 type=2,所以不取
// pid=1 和 type =2 又又是什么逻辑关系

说实话你的附言依然看不懂

感觉可以这样 xxx 代表一些 procedure

select pid from (select xxx(type) as type_str, pid group by pid) where xxx(type_str)

貌似是要根据某个 pid 是否只包含某个 type,找出符合的 pid

SELECT * FROM table1 a
WHERE NOT EXISTS
(SELECT 1 FROM table1 b
WHERE a.pid=b.pid
AND a.type <b.type)

回到顶部