以下是使用 PHP 和 Python 连接腾讯云 MySQL 的正确配置方法:
一、腾讯云 MySQL 准备工作
1. 创建数据库实例
- 在腾讯云控制台创建 MySQL 实例
- 记录以下信息:
- 内网地址(轻量服务器与 MySQL 同地域可用内网)
- 网络地址(如需网络访问)
- 端口(默认 3306)
- 数据库名
- 用户名和密码
2. 配置安全组
- 在轻量服务器安全组中开放 3306 端口
- 在 MySQL 安全组中添加轻量服务器的 IP
二、PHP 连接方法
使用 PDO(推荐)
<?php
$host = 'cdb-xxxxxxxxxx.gz.tencentcdb.com'; // 腾讯云MySQL地址
$port = '3306'; // 端口
$dbname = 'your_database';
$username = 'your_username';
$password = 'your_password';
try {
// 创建PDO连接
$dsn = "mysql:host=$host;port=$port;dbname=$dbname;charset=utf8mb4";
$pdo = new PDO($dsn, $username, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
]);
echo "连接成功!";
// 示例查询
$stmt = $pdo->query("SELECT VERSION()");
$version = $stmt->fetchColumn();
echo "MySQL版本: " . $version;
} catch (PDOException $e) {
die("连接失败: " . $e->getMessage());
}
?>
使用 MySQLi
<?php
$host = 'cdb-xxxxxxxxxx.gz.tencentcdb.com';
$port = 3306;
$username = 'your_username';
$password = 'your_password';
$database = 'your_database';
// 创建连接
$conn = new mysqli($host, $username, $password, $database, $port);
// 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 设置字符集
$conn->set_charset("utf8mb4");
echo "连接成功!";
// 关闭连接
$conn->close();
?>
三、Python 连接方法
使用 PyMySQL
import pymysql
import sys
# 数据库配置
config = {
'host': 'cdb-xxxxxxxxxx.gz.tencentcdb.com',
'port': 3306,
'user': 'your_username',
'password': 'your_password',
'database': 'your_database',
'charset': 'utf8mb4',
'cursorclass': pymysql.cursors.DictCursor
}
try:
# 建立连接
connection = pymysql.connect(**config)
print("连接成功!")
# 执行查询
with connection.cursor() as cursor:
# 查询MySQL版本
cursor.execute("SELECT VERSION()")
result = cursor.fetchone()
print(f"MySQL版本: {result['VERSION()']}")
# 示例:创建表
# cursor.execute("""
# CREATE TABLE IF NOT EXISTS users (
# id INT AUTO_INCREMENT PRIMARY KEY,
# name VARCHAR(100) NOT NULL,
# email VARCHAR(100) NOT NULL
# )
# """)
# 示例:插入数据
# sql = "INSERT INTO users (name, email) VALUES (%s, %s)"
# cursor.execute(sql, ('张三', 'zhangsan@example.com'))
# connection.commit()
except pymysql.Error as e:
print(f"数据库连接失败: {e}")
sys.exit(1)
finally:
if 'connection' in locals() and connection.open:
connection.close()
print("连接已关闭")
使用 SQLAlchemy(ORM)
from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker
# 连接字符串格式
# mysql+pymysql://用户名:密码@主机:端口/数据库名
DATABASE_URL = "mysql+pymysql://your_username:your_password@cdb-xxxxxxxxxx.gz.tencentcdb.com:3306/your_database?charset=utf8mb4"
try:
# 创建引擎
engine = create_engine(
DATABASE_URL,
pool_pre_ping=True, # 自动检测连接是否有效
pool_recycle=3600, # 连接回收时间(秒)
echo=False # 是否显示SQL语句(调试时设为True)
)
# 创建会话
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 测试连接
with engine.connect() as conn:
result = conn.execute(text("SELECT VERSION()"))
version = result.fetchone()[0]
print(f"连接成功!MySQL版本: {version}")
except Exception as e:
print(f"连接失败: {e}")
四、SSL 连接配置(增强安全性)
PHP PDO SSL 连接
$dsn = "mysql:host=$host;port=$port;dbname=$dbname;charset=utf8mb4";
$options = [
PDO::MYSQL_ATTR_SSL_CA => '/path/to/ca.pem',
PDO::MYSQL_ATTR_SSL_CERT => '/path/to/client-cert.pem',
PDO::MYSQL_ATTR_SSL_KEY => '/path/to/client-key.pem',
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false
];
$pdo = new PDO($dsn, $username, $password, $options);
Python PyMySQL SSL 连接
config = {
'host': 'your_host',
'port': 3306,
'user': 'your_username',
'password': 'your_password',
'database': 'your_database',
'ssl': {
'ca': '/path/to/ca.pem',
'cert': '/path/to/client-cert.pem',
'key': '/path/to/client-key.pem'
}
}
五、连接池配置(Python)
from DBUtils.PooledDB import PooledDB
import pymysql
# 创建连接池
pool = PooledDB(
creator=pymysql,
maxconnections=20, # 连接池最大连接数
mincached=5, # 初始化时创建的连接数
maxcached=10, # 连接池最大空闲连接数
blocking=True, # 连接数达到最大时是否阻塞等待
host='your_host',
port=3306,
user='your_username',
password='your_password',
database='your_database',
charset='utf8mb4'
)
# 从连接池获取连接
def get_connection():
return pool.connection()
六、环境变量配置(推荐)
创建 .env 文件:
DB_HOST=cdb-xxxxxxxxxx.gz.tencentcdb.com
DB_PORT=3306
DB_NAME=your_database
DB_USER=your_username
DB_PASSWORD=your_password
使用 python-dotenv 读取:
from dotenv import load_dotenv
import os
load_dotenv()
config = {
'host': os.getenv('DB_HOST'),
'port': int(os.getenv('DB_PORT')),
'user': os.getenv('DB_USER'),
'password': os.getenv('DB_PASSWORD'),
'database': os.getenv('DB_NAME')
}
七、常见问题排查
-
连接超时
- 检查安全组设置
- 确认网络连通性:
telnet host port - 调整连接超时时间
-
认证失败
- 检查用户名密码
- 确认用户权限
- 检查主机白名单
-
编码问题
- 统一使用
utf8mb4字符集 - 确保数据库、表、连接字符集一致
- 统一使用
八、最佳实践建议
- 使用连接池:避免频繁创建连接
- 异常处理:确保连接失败时有适当处理
- 环境分离:开发、测试、生产使用不同配置
- 定期维护:监控连接数,及时释放资源
- 使用内网地址:同地域服务器间使用内网连接,速度更快且免费
选择哪种方式取决于你的具体需求:
- 简单项目:直接使用 PyMySQL 或 MySQLi
- 复杂项目:推荐使用 SQLAlchemy(Python)或 PDO(PHP)
- 高并发场景:使用连接池管理
CLOUD技术笔记