当前位置:首页 > 数据库 > 正文

SQL连接数据库高效实战代码

连接数据库通常使用编程语言的数据库驱动,如Python的 pymysqlsqlite3库,基本步骤:导入库→建立连接(指定主机、用户、密码、数据库名)→创建游标对象→执行SQL查询(如SELECT)→获取结果→关闭连接,注意防注入和安全配置。

连接数据库必备信息

连接前需准备以下信息,通常由DBA或云服务商提供:

  1. 主机地址:IP或域名(如 localhost
  2. 端口号:默认MySQL为3306,PostgreSQL为5432
  3. 数据库名:目标库名称(如 mydb
  4. 认证凭证:用户名和密码
  5. 驱动类型:根据数据库选择对应驱动(如MySQL Connector/J)

主流语言连接示例

Python (mysql-connector)

import mysql.connector
config = {
  "host": "localhost",
  "port": 3306,
  "user": "your_username",
  "password": "your_password",
  "database": "mydb"
}
try:
  conn = mysql.connector.connect(**config)
  cursor = conn.cursor()
  # 执行查询(参数化防注入)
  cursor.execute("SELECT * FROM users WHERE age > %s", (18,))
  # 获取结果
  for (id, name, age) in cursor:
    print(f"ID: {id}, Name: {name}, Age: {age}")
except mysql.connector.Error as err:
  print(f"Database error: {err}")
finally:
  if 'conn' in locals() and conn.is_connected():
    cursor.close()
    conn.close()

Java (JDBC)

import java.sql.*;
public class DbDemo {
  public static void main(String[] args) {
    String url = "jdbc:mysql://localhost:3306/mydb";
    String user = "your_username";
    String password = "your_password";
    try (Connection conn = DriverManager.getConnection(url, user, password);
         Statement stmt = conn.createStatement()) {
      // 执行安全查询
      String sql = "SELECT product_name, price FROM products WHERE price > ?";
      PreparedStatement pstmt = conn.prepareStatement(sql);
      pstmt.setDouble(1, 100.0);
      ResultSet rs = pstmt.executeQuery();
      while (rs.next()) {
        System.out.println(rs.getString("product_name") + ": $" + rs.getDouble("price"));
      }
    } catch (SQLException e) {
      System.err.println("SQL Exception: " + e.getMessage());
    }
  }
}

PHP (PDO)

<?php
$host = 'localhost';
$dbname = 'mydb';
$user = 'your_username';
$pass = 'your_password';
try {
  $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, $pass);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  // 参数化查询
  $stmt = $pdo->prepare("SELECT email FROM subscribers WHERE active = :status");
  $stmt->execute(['status' => 1]); 
  while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo $row['email'] . "<br>";
  }
} catch (PDOException $e) {
  die("Connection failed: " . $e->getMessage());
}
?>

关键安全规范

  1. 永远使用参数化查询
    禁止拼接SQL语句(如 "SELECT * FROM users WHERE id=" + userInput),防止SQL注入攻击。

  2. 最小权限原则
    数据库账号仅授予必要权限(如只读账号禁止DROP操作)。

    SQL连接数据库高效实战代码  第1张

  3. 加密敏感信息
    使用环境变量或配置管理工具存储密码,禁止硬编码在代码中:

    # 正确做法(使用环境变量)
    import os
    password = os.environ['DB_PASSWORD']
  4. 连接池管理
    高并发场景使用连接池(如Java的HikariCP,Python的SQLAlchemy Pool)。


常见错误排查

错误现象 解决方案
Connection refused 检查防火墙/数据库是否监听指定端口
Access denied 验证用户名密码和主机白名单
No database selected 连接字符串中指定数据库名
Driver not found 检查JDBC/Python驱动是否安装

进阶实践建议

  1. 使用ORM工具
    推荐框架:Python的SQLAlchemy、Java的Hibernate,减少手写SQL风险。
  2. 配置连接超时
    添加超时参数避免阻塞(如Java的connectTimeout=5000)。
  3. 启用SSL加密
    云数据库连接强制使用SSL:

    // JDBC示例
    String url = "jdbc:mysql://host/db?useSSL=true&requireSSL=true";

权威引用

  • OWASP SQL注入防护指南 链接
  • MySQL官方Connector文档 链接
  • Oracle JDBC最佳实践 链接

通过遵循以上规范,可构建安全高效的数据库连接方案,实际开发中请根据所用语言和数据库版本查阅官方文档获取最新实践。

0