Ubuntu 下 Python 数据库连接配置指南
一 准备与安装
- 更新软件源并安装数据库(按需其一或多项)
- MySQL:sudo apt update && sudo apt install mysql-server
- PostgreSQL:sudo apt update && sudo apt install postgresql postgresql-contrib
- SQLite:通常系统自带,如需头文件可 sudo apt install sqlite3 libsqlite3-dev
- 安装 Python 驱动(与所用数据库匹配)
- MySQL:pip install mysql-connector-python 或 PyMySQL
- PostgreSQL:pip install psycopg2 或 psycopg2-binary
- SQLite:Python 内置 sqlite3 模块,无需额外安装
- 初始化与安全(如安装的是 MySQL)
- 执行 sudo mysql_secure_installation 完成基础加固(设置 root 密码、移除匿名用户等)
二 数据库与账户配置
- PostgreSQL
- 切换到 postgres 系统用户并进入 psql:sudo -u postgres psql
- 在 psql 中创建数据库与用户并授权:
- CREATE DATABASE yourdatabase;
- CREATE USER yourusername WITH ENCRYPTED PASSWORD ‘yourpassword’;
- GRANT ALL PRIVILEGES ON DATABASE yourdatabase TO yourusername;
- \q
- MySQL
- 登录 MySQL:mysql -u root -p
- 创建数据库:CREATE DATABASE yourdatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 创建用户并授权(示例仅允许本机):
- CREATE USER ‘yourusername’@‘localhost’ IDENTIFIED BY ‘yourpassword’;
- GRANT ALL PRIVILEGES ON yourdatabase.* TO ‘yourusername’@‘localhost’;
- FLUSH PRIVILEGES;
- 如需远程访问,创建 ‘yourusername’@‘%’ 并配置防火墙/云安全组放行 3306;MySQL 8 常见认证插件问题可用:ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘yourpassword’;
三 连接示例
- MySQL(mysql-connector-python)
- import mysql.connector
from mysql.connector import Error
try:
conn = mysql.connector.connect(
host=‘localhost’,
port=3306,
database=‘yourdatabase’,
user=‘yourusername’,
password=‘yourpassword’,
charset=‘utf8mb4’
)
cur = conn.cursor()
cur.execute(“SELECT DATABASE();”)
print(cur.fetchone())
except Error as e:
print(“MySQL error:”, e)
finally:
if conn.is_connected(): cur.close(); conn.close()
- PostgreSQL(psycopg2)
- import psycopg2
try:
conn = psycopg2.connect(
dbname=‘yourdatabase’,
user=‘yourusername’,
password=‘yourpassword’,
host=‘localhost’,
port=5432
)
cur = conn.cursor()
cur.execute(“SELECT version();”)
print(cur.fetchone())
except Exception as e:
print(“PostgreSQL error:”, e)
finally:
if conn: cur.close(); conn.close()
- SQLite(内置模块)
- import sqlite3
conn = sqlite3.connect(‘yourdatabase.db’)
cur = conn.cursor()
cur.execute(‘’‘CREATE TABLE IF NOT EXISTS t(id INTEGER PRIMARY KEY, name TEXT)’‘’)
conn.commit()
cur.execute(“INSERT INTO t(name) VALUES (?)”, (“Alice”,))
for row in cur.execute(“SELECT * FROM t”):
print(row)
conn.close()
四 常见问题与排查
- Access denied / plugin auth_socket
- 现象:root 本地连不上或仅系统用户可连
- 处理:ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘newpass’; 或创建专用用户并授予目标库权限
- 1044 Access denied for user
- 现象:指定了数据库名就连不上
- 处理:GRANT ALL PRIVILEGES ON db_name.* TO ‘user’@‘host’; FLUSH PRIVILEGES;
- 2002 Can’t connect to MySQL server
- 现象:连接被拒绝或超时
- 处理:确认服务运行 sudo systemctl status mysql;检查端口 3306 监听与防火墙/云安全组;远程连接需使用正确主机与账户
- 字符集乱码
- 处理:库/表/连接统一使用 utf8mb4,连接参数 charset=‘utf8mb4’