美文网首页Python
Python-数据存储(SQLite)

Python-数据存储(SQLite)

作者: 阿凡提说AI | 来源:发表于2024-09-10 00:05 被阅读0次

    在Python中,你可以使用内置的sqlite3模块来操作SQLite数据库。以下是一些使用sqlite3模块进行数据存储的基础步骤:

    1. 连接到SQLite数据库

    import sqlite3
    # 连接到SQLite数据库
    # 如果数据库不存在,会自动在当前目录创建:
    conn = sqlite3.connect('example.db')
    

    2. 创建一个表

    # 创建一个Cursor对象并通过它执行SQL语句
    cursor = conn.cursor()
    # 创建表
    cursor.execute('''CREATE TABLE IF NOT EXISTS stocks
                      (date text, trans text, symbol text, qty real, price real)''')
    # 提交事务
    conn.commit()
    

    3. 插入数据

    # 插入数据
    cursor.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
    # 提交事务
    conn.commit()
    

    4. 查询数据

    # 查询数据
    cursor.execute('SELECT * FROM stocks')
    rows = cursor.fetchall()
    for row in rows:
        print(row)
    

    5. 更新数据

    # 更新数据
    cursor.execute("UPDATE stocks SET price = 38.00 WHERE symbol = 'RHAT'")
    # 提交事务
    conn.commit()
    

    6. 删除数据

    # 删除数据
    cursor.execute("DELETE FROM stocks WHERE symbol = 'RHAT'")
    # 提交事务
    conn.commit()
    

    7. 使用上下文管理器确保关闭连接

    # 使用with语句确保连接被正确关闭
    with sqlite3.connect('example.db') as conn:
        cursor = conn.cursor()
        # 执行SQL操作...
    

    8. 关闭Cursor和连接

    # 关闭Cursor
    cursor.close()
    # 关闭连接
    conn.close()
    

    在操作数据库时,通常建议使用with语句来管理数据库连接,这样可以确保即使在发生异常的情况下,连接也能被正确关闭。
    此外,sqlite3模块还支持使用Python的DB-API 2.0规范定义的参数替换,这可以防止SQL注入攻击:

    # 使用参数替换来防止SQL注入
    t = ('RHAT',)
    cursor.execute('SELECT * FROM stocks WHERE symbol=?', t)
    print(cursor.fetchone())
    

    请确保在处理数据库时遵循良好的编程实践,包括但不限于使用参数化查询来防止SQL注入攻击,以及在事务中适当地提交和回滚更改。
    创建一个学生表

    import sqlite3
    
    # 创建一个内存数据库进行操作
    conn = sqlite3.connect(':memory:')
    cursor = conn.cursor()
    
    # 创建表
    create_table_query = """
    CREATE TABLE IF NOT EXISTS Students (
        id INTEGER PRIMARY KEY,
        name TEXT,
        age INTEGER,
        email TEXT UNIQUE
    );
    """
    cursor.execute(create_table_query)
    
    # 检查表是否创建成功
    cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='Students';")
    table_exists = cursor.fetchone()
    
    table_exists
    
    

    清空表:这将删除表中的所有行,但表结构会保留。

    DELETE FROM Students;
    

    删除表:这将删除整个表,包括表结构和所有数据。

    DROP TABLE Students;
    
    # 清空表
    cursor.execute("DELETE FROM Students;")
    
    # 检查表是否为空
    cursor.execute("SELECT * FROM Students;")
    is_table_empty = cursor.fetchall()
    
    # 删除表
    cursor.execute("DROP TABLE Students;")
    
    # 检查表是否还存在
    cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='Students';")
    table_exists_after_drop = cursor.fetchone()
    
    is_table_empty, table_exists_after_drop
    
    

    内连接

    # 创建 Customers 表
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS Customers (
        CustomerID INTEGER PRIMARY KEY,
        CustomerName TEXT
    );
    ''')
    
    # 创建 Orders 表
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS Orders (
        OrderID INTEGER PRIMARY KEY,
        CustomerID INTEGER,
        OrderDate TEXT,
        FOREIGN KEY(CustomerID) REFERENCES Customers(CustomerID)
    );
    ''')
    
    # 插入 Customers 表的示例数据
    customers_data = [
        (1, 'John Doe'),
        (2, 'Jane Smith'),
        (3, 'Alice Johnson')
    ]
    cursor.executemany("INSERT INTO Customers (CustomerID, CustomerName) VALUES (?, ?);", customers_data)
    
    # 插入 Orders 表的示例数据
    orders_data = [
        (101, 1, '2023-09-10'),
        (102, 2, '2023-09-11'),
        (103, 1, '2023-09-12')
    ]
    cursor.executemany("INSERT INTO Orders (OrderID, CustomerID, OrderDate) VALUES (?, ?, ?);", orders_data)
    
    # 执行内连接查询
    cursor.execute('''
    SELECT Orders.OrderID, Customers.CustomerName 
    FROM Orders 
    INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
    ''')
    inner_join_results = cursor.fetchall()
    
    inner_join_results 
    #输出:[(101, ‘John Doe’), (102, ‘Jane Smith’), (103, ‘John Doe’)]
    
    

    排序

    # 创建 Employees 表
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS Employees (
        EmployeeID INTEGER PRIMARY KEY,
        EmployeeName TEXT,
        Salary REAL
    );
    ''')
    
    # 插入 Employees 表的示例数据
    employees_data = [
        (1, 'John Doe', 70000),
        (2, 'Jane Smith', 65000),
        (3, 'Alice Johnson', 72000),
        (4, 'Mike Brown', 63000)
    ]
    cursor.executemany("INSERT INTO Employees (EmployeeID, EmployeeName, Salary) VALUES (?, ?, ?);", employees_data)
    
    # 执行查询并按 Salary 降序排序
    cursor.execute('SELECT EmployeeName, Salary FROM Employees ORDER BY Salary DESC;')
    sorted_employees_by_salary = cursor.fetchall()
    
    sorted_employees_by_salary
    

    COUNT():返回表中行的数量,或者返回特定列中非NULL值的数量。
    SUM():返回数值列的总和。
    AVG():返回数值列的平均值。
    MAX():返回数值列中的最大值,或日期/时间列中的最新值。
    MIN():返回数值列中的最小值,或日期/时间列中的最早值。

    # 使用聚合函数查询 Employees 表
    
    # 1. 计算总行数
    cursor.execute('SELECT COUNT(*) FROM Employees;')
    total_rows = cursor.fetchone()[0]
    
    # 2. 计算薪资总和
    cursor.execute('SELECT SUM(Salary) FROM Employees;')
    total_salary = cursor.fetchone()[0]
    
    # 3. 计算平均薪资
    cursor.execute('SELECT AVG(Salary) FROM Employees;')
    average_salary = cursor.fetchone()[0]
    
    # 4. 获取最高薪资
    cursor.execute('SELECT MAX(Salary) FROM Employees;')
    max_salary = cursor.fetchone()[0]
    
    # 5. 获取最低薪资
    cursor.execute('SELECT MIN(Salary) FROM Employees;')
    min_salary = cursor.fetchone()[0]
    
    total_rows, total_salary, average_salary, max_salary, min_salary
    
    

    分组(GROUP BY)是SQL中用于将数据分成多个小组以便于聚合的语句。在分组后,可以使用聚合函数(如COUNT(), SUM(), AVG(), MAX(), MIN()等)对每个分组进行计算。

    # 执行分组查询并计算每个部门的平均薪资,同时过滤出平均薪资大于50,000的部门
    cursor.execute('''
        SELECT department, AVG(salary) as average_salary 
        FROM Employees 
        GROUP BY department 
        HAVING AVG(salary) > 50000;
    ''')
    
    # 获取查询结果
    grouped_results = cursor.fetchall()
    grouped_results
    #输出:[(‘HR’, 57000.0), (‘IT’, 67666.66666666667), (‘Marketing’, 75000.0)]
    

    使用pymysql模块操作MySQL

    import pymysql
    
    # 连接到数据库
    db = pymysql.connect(
        host='127.0.0.1',  # 数据库地址
        user='root',       # 数据库用户名
        password='123456', # 数据库密码
        database='test',   # 数据库名
        charset='utf8'     # 字符集
    )
    
    # 创建游标对象
    cursor = db.cursor()
    
    # 执行SQL语句
    try:
        # 执行一个查询操作
        cursor.execute("SELECT * FROM your_table_name")
        
        # 获取所有结果
        results = cursor.fetchall()
        
        # 打印结果
        for row in results:
            print(row)
        
        # 提交事务
        db.commit()
    except Exception as e:
        # 如果发生错误,回滚事务
        db.rollback()
        print(f"An error occurred: {e}")
    finally:
        # 关闭游标和连接
        cursor.close()
        db.close()
    
    

    相关文章

      网友评论

        本文标题:Python-数据存储(SQLite)

        本文链接:https://www.haomeiwen.com/subject/uoxyljtx.html