Files
PythonLearn/04_数据库/4_1_PostgreSQL与Psycopg入门/附录_Psycopg安装与排错.md
T

495 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 附录:Psycopg安装、环境选择与常见问题排查
## 一、附录用途
本附录集中说明Windows环境下安装Psycopg 3时容易混淆的问题,并整理本课程实际遇到的错误。正文只保留数据库编程主线;安装失败、解释器不一致或原生库异常时,再查阅本附录。
本附录覆盖两种安装方式:
1. 使用pip安装;
2. 使用Conda安装。
无论选择哪一种,都应先创建课程专用环境,不建议把课程依赖继续安装到系统级`base`环境。
## 二、先分清Psycopg 2和Psycopg 3
以下名称非常相似,但不是同一个版本:
| 安装包 | Python导入语句 | 说明 |
|---|---|---|
| `psycopg` | `import psycopg` | Psycopg 3主体包 |
| `psycopg-binary` | 仍然使用`import psycopg` | Psycopg 3预编译二进制实现 |
| `psycopg-c` | 仍然使用`import psycopg` | Psycopg 3本地C扩展实现 |
| `psycopg2` | `import psycopg2` | Psycopg 2源码/本地库方案 |
| `psycopg2-binary` | `import psycopg2` | Psycopg 2预编译方案 |
不存在以下正确导入方式:
```python
import psycopg3
import psycopg_binary
import psycopg2_binary
```
本课程使用Psycopg 3,因此代码统一写:
```python
import psycopg
```
如果编辑器只能找到`psycopg2`,通常表示安装的是Psycopg 2,或者编辑器选用了另一个Python解释器。
## 三、Psycopg 3的三种底层实现
Psycopg 3主体包会选择一种底层`libpq`包装实现。`libpq`是PostgreSQL官方客户端库,负责底层数据库通信。
| 实现 | 常见安装方式 | 特点 | 额外要求 |
|---|---|---|---|
| `python` | `pip install psycopg` | 纯Python包装,适合调试和小型任务 | 系统中必须能找到`libpq` |
| `c` | `pip install "psycopg[c]"`或Conda的`psycopg-c` | C扩展,性能较好 | 本地`libpq`;pip源码构建还需要编译工具 |
| `binary` | `pip install "psycopg[binary]"` | 预编译并自带客户端库,安装最省事 | 需要当前Python和平台存在可用二进制包 |
查看当前实际使用的实现:
```powershell
python -c "import psycopg, psycopg.pq; print(psycopg.__version__); print(psycopg.pq.__impl__); print(psycopg.pq.version())"
```
可能输出:
```text
3.3.4
binary
180004
```
其中:
- 第一行是Psycopg版本;
- 第二行是`python`、`c`或`binary`实现;
- 第三行是实际加载的`libpq`版本号。
## 四、安装前先确认当前环境
### 4.1 查看Conda环境
```powershell
conda env list
```
当前激活环境前会显示`*`。
### 4.2 查看Python解释器
```powershell
python -c "import sys; print(sys.executable); print(sys.version)"
```
如果课程环境名为`python-test`,路径应类似:
```text
C:\Users\你的用户名\.conda\envs\python-test\python.exe
```
如果仍然显示:
```text
C:\ProgramData\miniconda3\python.exe
```
说明当前使用的还是系统级`base`解释器。
### 4.3 为什么不推荐系统级base
系统级Miniconda可能安装在:
```text
C:\ProgramData\miniconda3
```
普通用户通常没有写权限,安装时会出现:
```text
EnvironmentNotWritableError
```
独立环境还可以避免数据库课程依赖污染其他Python项目,也便于删除和重建。
## 五、方式一:使用pip安装
### 5.1 创建并激活Conda环境
可以让Conda只负责环境和Python,再让pip安装Psycopg:
```powershell
conda create -n python-test python=3.13 pip
conda activate python-test
```
### 5.2 推荐安装命令
本地学习优先使用预编译二进制实现:
```powershell
python -m pip install "psycopg[binary]>=3,<4"
```
也可以使用本课的依赖文件:
```powershell
python -m pip install -r requirements.txt
```
`requirements.txt`中的:
```text
psycopg[binary]>=3,<4
```
表示:
- 安装Psycopg 3;
- 同时安装`binary`额外依赖;
- 版本不低于3且低于4。
### 5.3 为什么使用`python -m pip`
不要优先直接执行:
```powershell
pip install ...
```
直接运行`pip.exe`时,可能遇到访问被拒绝,或者调用了其他环境中的pip。下面的写法明确表示“使用当前Python解释器对应的pip”:
```powershell
python -m pip install ...
```
这能降低“包安装成功,但程序使用另一个Python”的概率。
### 5.4 pip国内镜像临时用法
如果访问PyPI失败,可以只为当前命令指定镜像:
```powershell
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple "psycopg[binary]>=3,<4"
```
临时指定不会永久修改系统或用户配置。
### 5.5 pip安装后的确认
```powershell
python -m pip show psycopg psycopg-binary
python -c "import sys, psycopg, psycopg.pq; print(sys.executable); print(psycopg.__version__); print(psycopg.pq.__impl__)"
```
预期底层实现通常是:
```text
binary
```
## 六、方式二:使用Conda安装
### 6.1 创建独立环境并一次安装
推荐让核心包全部来自`conda-forge`,减少Python、OpenSSL和`libpq`混用不同频道的风险:
```powershell
conda create -n python-db --override-channels -c conda-forge python=3.13 psycopg psycopg-c libpq openssl
conda activate python-db
```
如果已经创建了`python-test`:
```powershell
conda activate python-test
conda install -c conda-forge psycopg psycopg-c libpq
```
不要在激活`python-test`后仍然写:
```powershell
conda install -n base ...
```
`-n base`会明确要求安装到`base`,不会因为当前激活了`python-test`而自动改用当前环境。
### 6.2 Conda不能使用pip的`-r`
下面的命令是错误的:
```powershell
conda install -r requirements.txt
```
`-r requirements.txt`是pip的参数,不是Conda的通用安装方式。对应写法是:
```powershell
python -m pip install -r requirements.txt
```
使用Conda时则应直接写包名:
```powershell
conda install -c conda-forge psycopg psycopg-c libpq
```
### 6.3 配置清华Conda镜像
访问官方`conda-forge`失败时,可以把`conda-forge`映射到清华镜像:
```powershell
conda config --set show_channel_urls yes
conda config --set custom_channels.conda-forge https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
conda clean --index-cache
```
查看最终配置来源:
```powershell
conda config --show-sources
conda config --show custom_channels
```
Windows用户级配置通常位于:
```text
C:\Users\你的用户名\.condarc
```
然后重新安装:
```powershell
conda activate python-test
conda install -c conda-forge psycopg psycopg-c libpq
```
### 6.4 Conda安装后的确认
```powershell
conda list | Select-String "python|psycopg|libpq|openssl"
python -c "import sys, psycopg, psycopg.pq; print(sys.executable); print(psycopg.__version__); print(psycopg.pq.__impl__); print(psycopg.pq.version())"
```
使用`psycopg-c`时,底层实现应为:
```text
c
```
## 七、pip和Conda的区别
| 对比项 | pip | Conda |
|---|---|---|
| 主要管理对象 | Python包 | Python包、解释器和原生库 |
| 默认软件仓库 | PyPI | defaults或conda-forge等频道 |
| 环境创建 | 通常配合`venv`或Conda | 原生支持`conda create` |
| `libpq`、OpenSSL等原生依赖 | binary包可自带;否则依赖系统 | 可以作为Conda包统一安装 |
| 安装速度与包可用性 | PyPI新版本通常更及时 | 取决于频道是否已构建对应平台包 |
| 依赖解析范围 | 主要关注Python包 | 同时解析Python和原生库依赖 |
| 本课推荐场景 | 希望安装简单、使用`binary`实现 | 希望统一管理Python、C扩展和`libpq` |
### 7.1 pip方案的优势
- 命令与大多数Python项目的`requirements.txt`一致;
- `psycopg[binary]`通常安装最直接;
- 预编译包自带所需客户端库,受本机DLL路径影响较小;
- PyPI上的版本通常更新较快。
### 7.2 Conda方案的优势
- 可以同时管理Python、`psycopg-c`、`libpq`和OpenSSL;
- 不需要手工准备Visual Studio C++编译环境;
- 适合已经使用Conda管理数据分析或科学计算环境的项目。
### 7.3 不建议随意混装
同一个环境中可以混合使用Conda和pip,但顺序和边界必须清楚。推荐:
1. 先用Conda安装Python及能够满足的原生依赖;
2. 再用当前环境的`python -m pip`安装Conda没有的Python包;
3. pip安装后不要再让Conda大范围重算并替换同一批核心依赖;
4. 出现原生崩溃时,检查Python、Psycopg、`libpq`和OpenSSL是否来自相互兼容的来源。
本课程选择一种方案成功后即可,不需要同时安装`psycopg-c`和`psycopg-binary`。
## 八、实际遇到的问题与原因
### 8.1 `conda install -r requirements.txt`报参数错误
错误原因:把pip参数用于Conda。
正确处理:
```powershell
python -m pip install -r requirements.txt
```
或者使用Conda包名安装。
### 8.2 直接运行`pip.exe`显示`Access is denied`
可能原因包括`pip.exe`权限、命令解析或环境路径异常。
优先改为:
```powershell
python -m pip install -r requirements.txt
```
同时用`sys.executable`确认当前Python。
### 8.3 `EnvironmentNotWritableError`
典型信息:
```text
environment location: C:\ProgramData\miniconda3
```
原因:普通用户没有系统级`base`环境写权限。
推荐处理:创建用户自己的独立环境,不要修改系统目录权限:
```powershell
conda create -n python-test python=3.13 pip
conda activate python-test
```
### 8.4 激活新环境后仍然安装到base
错误命令:
```powershell
conda activate python-test
conda install -n base -c conda-forge psycopg
```
`-n base`覆盖了当前环境选择。正确写法:
```powershell
conda install -c conda-forge psycopg
```
或明确指定:
```powershell
conda install -n python-test -c conda-forge psycopg
```
### 8.5 CondaHTTPError访问`conda-forge`失败
先检查:
```powershell
conda config --show-sources
conda config --show channels
conda config --show proxy_servers
```
配置没有错误时,可能是网络、代理或官方源可达性问题。可以使用前面的清华镜像配置后清理索引缓存重试。
### 8.6 只能导入`psycopg2`
原因通常是安装了`psycopg2-binary`,而不是Psycopg 3。
确认命令:
```powershell
python -c "import importlib.util; print(importlib.util.find_spec('psycopg')); print(importlib.util.find_spec('psycopg2'))"
python -m pip show psycopg psycopg-binary psycopg2-binary
```
本课程需要`psycopg`能够被找到。
### 8.7 `no pq wrapper available`
典型信息:
```text
- couldn't import psycopg 'c' implementation
- couldn't import psycopg 'binary' implementation
- couldn't import psycopg 'python' implementation: libpq library not found
```
含义:
- 没有`psycopg-c`;
- 没有`psycopg-binary`;
- 纯Python实现又找不到`libpq`。
解决方式任选其一:
```powershell
python -m pip install psycopg-binary
```
或者通过Conda安装完整本地库:
```powershell
conda install -c conda-forge psycopg psycopg-c libpq
```
### 8.8 PyCharm退出代码`0xC0000005`
`0xC0000005`是Windows原生访问冲突,不是普通Python异常,`try...except`无法捕获。它曾发生在`psycopg.connect()`进入C扩展或客户端DLL后。
排查步骤:
1. 在终端使用同一个解释器运行同一文件;
2. 输出`sys.executable`确认解释器一致;
3. 输出`psycopg.pq.__impl__`确认底层实现;
4. 检查环境是否混用了不同频道的Python、`psycopg-c`、`libpq`和OpenSSL;
5. 优先重建核心包来源一致的环境;
6. 本地学习也可以改用`psycopg-binary`降低DLL路径差异。
Conda的Windows原生库通常位于:
```text
C:\Users\你的用户名\.conda\envs\环境名\Library\bin
```
PyCharm必须选择正确的Conda解释器。必要时检查其运行配置是否能找到该目录中的DLL。
## 九、编辑器解释器检查
在PyCharm中选择的解释器必须与终端验证成功的解释器一致。例如:
```text
C:\Users\你的用户名\.conda\envs\python-test\python.exe
```
可以在程序中临时确认:
```python
import sys
print(sys.executable)
```
如果终端能够导入、PyCharm不能导入,通常不是代码问题,而是编辑器解释器或原生库搜索路径不同。
## 十、最终安装验收清单
依次执行:
```powershell
conda env list
python -c "import sys; print(sys.executable); print(sys.version)"
python -c "import psycopg, psycopg.pq; print(psycopg.__version__); print(psycopg.__file__); print(psycopg.pq.__impl__); print(psycopg.pq.version())"
```
验收标准:
- Python路径指向预期的课程环境;
- `import psycopg`成功;
- Psycopg主版本为3;
- 底层实现是预期的`binary`、`c`或`python`;
- PyCharm与PowerShell使用同一个解释器;
- 实际运行第一课连接示例时不出现导入错误或原生崩溃。
安装只解决客户端依赖。数据库地址、端口、防火墙、代理、PostgreSQL监听和账号权限属于连接问题,应与安装问题分开判断。