上一篇
使用代码添加数据库连接需导入数据库驱动库,调用连接函数并传入主机、端口、用户名、密码及数据库名等参数,以Python为例,常用
pymysql.connect()或
sqlite3.connect()建立连接,最后需显式关闭连接释放资源。
核心准备工作
-
获取数据库凭据
- 数据库类型(MySQL/PostgreSQL/SQL Server等)
- 主机地址(如
localhost或云数据库IP) - 端口号(MySQL默认3306,PostgreSQL默认5432)
- 数据库名称
- 用户名和密码
-
安装数据库驱动
根据语言选择对应驱动:
# Python pip install mysql-connector-python pymysql # Node.js npm install mysql2 # Java (Maven) <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>
代码实现示例
Python (MySQL)
import mysql.connector
from mysql.connector import Error
try:
# 创建连接
connection = mysql.connector.connect(
host="localhost",
user="your_username",
password="your_password",
database="your_database"
)
if connection.is_connected():
cursor = connection.cursor()
cursor.execute("SELECT VERSION()") # 测试查询
version = cursor.fetchone()
print("Database version:", version)
except Error as e:
print("连接失败:", e)
finally:
if connection.is_connected():
cursor.close()
connection.close() # 必须关闭连接!
Node.js (MySQL)
const mysql = require('mysql2');
// 创建连接池(推荐)
const pool = mysql.createPool({
host: 'localhost',
user: 'your_username',
password: 'your_password',
database: 'your_database',
waitForConnections: true,
connectionLimit: 10
});
// 执行查询
pool.query('SELECT 1 + 1 AS solution', (error, results) => {
if (error) throw error;
console.log('Result:', results[0].solution);
});
// 关闭连接池(在应用退出时)
process.on('exit', () => pool.end());
Java (JDBC)
import java.sql.*;
public class DBConnection {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database";
String user = "your_username";
String password = "your_password";
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement()) {
ResultSet rs = stmt.executeQuery("SELECT VERSION()");
if (rs.next()) {
System.out.println("Database version: " + rs.getString(1));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
关键安全实践
-
绝不硬编码凭据
使用环境变量或配置文件:# Python示例:从.env文件加载 from dotenv import load_dotenv import os load_dotenv() host = os.getenv("DB_HOST") -
防御SQL注入
使用参数化查询(非字符串拼接):
# Python安全查询 cursor.execute("SELECT * FROM users WHERE email = %s", (user_email,)) -
连接池管理
- 避免频繁创建/销毁连接(如Java的HikariCP、Python的
DBUtils) - 设置合理的连接超时时间
- 避免频繁创建/销毁连接(如Java的HikariCP、Python的
-
启用SSL加密
云数据库需配置SSL(以Node.js为例):const pool = mysql.createPool({ ssl: { rejectUnauthorized: true }, // ...其他配置 });
常见错误排查
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
Connection refused |
数据库服务未启动/端口错误 | 检查服务状态及防火墙设置 |
Access denied |
用户名/密码错误 | 核对凭据及数据库权限 |
Too many connections |
连接未关闭或超出限制 | 优化连接池配置,确保资源释放 |
SSL connection error |
证书配置问题 | 更新CA证书或禁用SSL(仅测试) |
进阶建议
- 使用ORM工具
如Python的SQLAlchemy、Java的Hibernate,简化操作并提升安全性。 - 定期更新驱动
避免已知破绽(如CVE-2022-32221)。 - 监控连接状态
通过数据库命令(如MySQL的SHOW STATUS LIKE 'Threads_connected')检测泄漏。
引用说明:本文代码示例参考了MySQL官方文档、Python DB-API标准及OWASP SQL注入防护指南,安全实践遵循NIST SP 800-123标准,连接池配置参考了Oracle JDBC最佳实践。

