Repository navigation
Expand file tree
/
Copy pathpostgresql.html
More file actions
287 lines (286 loc) · 37.5 KB
/
Copy pathpostgresql.html
File metadata and controls
287 lines (286 loc) · 37.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Matt Makai">
<meta name="description" content="PostgreSQL 是一款开源的关系型数据库,它常用于 Python 应用中。">
<title>PostgreSQL - Full Stack Python</title>
<link href="/f.css" rel="stylesheet">
<link rel="shortcut icon" href="/img/fsp-fav.png">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="logo-header-section">
<a href="/" style="text-decoration: none; border: none;"><img src="/img/logo-sm.png" class="logo-image" alt="Full Stack Python logo"></a>
<span class="logo-title"><a href="https://www.fullstackpython.com/">Full Stack Python</a></span>
</div>
<div class="sans-font">
<!--<a href="/blog.html" class="submenu-item-first">Blog</a> |
<a href="/books.html" class="submenu-item">Books</a> | -->
<a href="/table-of-contents.html">全部主题</a>
<span style="margin:0 12px 0 12px">|</span>
<a href="/blog.html">Blog</a>
<span style="margin:0 12px 0 12px">|</span>
<a href="/email.html">时讯</a>
<span style="margin:0 12px 0 12px">|</span>
<a href="https://twitter.com/fullstackpython">@fullstackpython</a>
<span style="margin:0 12px 0 12px">|</span>
<a href="https://www.facebook.com/fullstackpython">Facebook</a>
<span style="margin:0 12px 0 12px">|</span>
<a href="https://github.com/mattmakai/fullstackpython.com">源码</a>
</div> </div>
</div><div class="row">
<div class="col-md-8">
<h1>PostgreSQL</h1>
<p><a href="http://www.postgresql.org/">PostgreSQL</a>, 通常写作 "Postgres",发音为 "Poss-gres", 是一款开源的 <a href="/databases.html">关系型数据库</a> 实现,它常在 Python 应用中作为数据存取的后端使用。</p>
<p><img src="/img/postgresql.jpg" width="100%" alt="PostgreSQL logo." class="technical-diagram" /></p>
<h2>PostgreSQL 如何应用于 Python 开发?</h2>
<p>PostgreSQL 是很多 Python 开发人员的默认数据库选项,包括 Django 团队在测试 <a href="/object-relational-mappers-orms.html">Django ORM</a> 时也选得它。 相比于 MySQL、SQLServer 和 Oracle,人们通常认为 PostgreSQL 具有更多功能且更加稳定。选择以上任何一款数据库都没有错。但是,由于 PostgreSQL 倾向于被较多的 Python 开发人员选用,因而针对该数据库的驱动器和示例代码也会有更好的文档,在典型使用场景中存在 BUG 的几率也会更小。如果你想在 Django 中使用 Oracle,你会发现有关 Oracle 的配置示例代码相比 PostgreSQL 后端的少得多。</p>
<div class="well see-also">PostgreSQL 是对 <a href="/databases.html">关系型数据库</a> 概念的一种实现。在 <a href="/data.html">数据</a> 那一章学习更多相关知识,或者到 <a href="/table-of-contents.html">总目录页</a> 了解所有主题。</div>
<h2>为什么说 PostgreSQL 是一个不错的数据库选择?</h2>
<p>PostgreSQL 的开源许可允许开发人员无需考虑许可费用问题就可操作一个或多个数据库。开源许可运营模式相较于 Oracle 或其它专有数据库,其花费更少,特别是在规模增加到需要复制和分片的时候。另外,由于从独立开发人员和跨国组织等的大量人员使用 PostgreSQL,因而相比于其它的关系型数据库,找到具有 PostgreSQL 经验的开发人员通常容易的多。</p>
<p>PostgreSQL 核心团队还经常发布更新,从而显著提高了数据库的能力。例如, <a href="http://www.postgresql.org/docs/9.4/static/release-9-4.html">PostgreSQL 9.4 版本</a> 就增加了 <a href="http://www.postgresql.org/docs/9.4/static/datatype-json.html">jsonb 类型</a>,用来增强对 JavaScript 对象表示 (<a href="http://www.json.org/">JSON</a>) 的存储能力,从而减少了在一个应用体系中另外再使用一个独立 <a href="/no-sql-datastore.html">NoSQL 数据库</a> 的需求。</p>
<h2>在 Python 中连接 PostgreSQL</h2>
<p>在 Python 中使用关系型数据库,需要一个数据库驱动器,通常也叫作数据库连接器。连接 PostgreSQL 的最常用驱动库是 <a href="http://initd.org/psycopg/">psycopg2</a>。在 <a href="https://wiki.postgresql.org/wiki/Python">PostgreSQL 官网的 wiki 页上有一份有关所有驱动器的列表</a>,其中包括了一些已经不再维护了的库。如果你使用 <a href="https://docs.python.org/3.4/library/asyncio.html">asyncio 这个 Python 标准库</a> 的话,你还应该了解下 <a href="https://github.com/aio-libs/aiopg">aiopg</a>,它还封装了 psycopg2 的异步操作功能。</p>
<p>要想在数据表和对象间抽象出对应关系,许多 Python 开发人员会利用 <a href="/object-relational-mappers-orms.html">对象-关系映射器 (ORM)</a> 来将 PostgreSQL 中的关系型数据转化成可以在 Python 代码中使用的对象。例如,PostgreSQL 提供关系型数据库功能,而 psycopg 是常用的数据库连接器,但很多 ORM 能用于各种不同的 Web 框架,如下图所示。</p>
<p><img src="/img/postgresql-orm-examples.png" width="100%" alt="各种不同的 Python ORM 如何与 PostgreSQL 和 psycopg2 连接器一起使用的例子。" class="technical-diagram" /></p>
<p>到 <a href="/object-relational-mappers-orms.html">关于 Python ORM 主题的特定页</a> 了解更多知识。</p>
<h2>PostgreSQL 数据安全性</h2>
<p>如果你使用 Linux,那么使用包管理器就能很容易地安装 PostgreSQL。但是,一旦数据库安装运行后,你的责任才刚刚开始。在将其用于生产环境前,确保:</p>
<ol>
<li>通过 <code>pg_hba.conf</code> 文件将访问者限制到 <a href="http://www.postgresql.org/docs/9.3/static/auth-pg-hba-conf.html">一份白名单里</a></li>
<li>开启 <a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-master-slave-replication-on-postgresql-on-an-ubuntu-12-04-vps">复制</a> 到另一个数据库的功能,另一个数据库最好位于另一个地方的不同基础设施之上。</li>
<li>定期执行 <a href="http://www.postgresql.org/docs/current/static/backup.html">备份并且测试还原过程</a></li>
<li>确保你的应用已经对 <a href="https://www.owasp.org/index.php/SQL_Injection">SQL 注入攻击</a> 进行了预防</li>
</ol>
<p>尽可以邀请有资质的人员进行一次 <a href="http://security.stackexchange.com/questions/2517/postgresql-security-audit">PostgreSQL 安全审计</a>,以便找出数据库中的最大安全隐患。小型应用和初创公司刚开始通常负担不了一个全职审计员,但是随着应用程序的发展,它将越有可能成为攻击目标。</p>
<p>存储在数据库中的数据是应用的生命力所在。如果你曾经 <a href="https://www.twilio.com/blog/2014/02/introducing-developer-evangelist-matt-makai.html">不小心删除过一个生产环境中的数据库</a> 或者是 SQL 注入攻击等恶意行为的受害者,你就会明白:只需事先进行诸如备份、复制和安全举措等额外一点儿工作,都能使数据恢复变得更加容易。</p>
<h2>针对 Python 的 PostgreSQL 相关资源</h2>
<p>有很多针对 Django、Flask 及其它 Web 框架的入门教程资料。以下列出的几篇是我读过的最好的。</p>
<ul>
<li>
<p><a href="/blog/postgresql-python-3-psycopg2-ubuntu-1604.html">在 Ubuntu 16.04 上进行 Python 3、 psycopg 和 PostgreSQL 配置</a> 提供了如何在一个刚安装的 Ubuntu 上安装使用 PostgreSQL 和 Python 3 的操作指南。</p>
</li>
<li>
<p>这篇有关 <a href="http://killtheyak.com/use-postgresql-with-django-flask/">在 Django 或 Flask 中使用 PostgreSQL</a> 的文章是针对这两个框架的非常精彩的入门指南。</p>
</li>
<li>
<p>这篇文章讲解了如何及为何 PostgreSQL 在许多情况下能用来处理 <a href="http://blog.lostpropertyhq.com/postgres-full-text-search-is-good-enough/">全文检索</a>。如果想进一步研究的话,<a href="http://blog.garage-coding.com/2015/12/18/postgres-fulltext-search.html">这篇文章讲述了一个开发者使用 SQLAlchemy 来实现 PostgreSQL 全文检索</a>。</p>
</li>
<li>
<p><a href="http://django-postgres-copy.californiacivicdata.org/en/latest/">django-postgres-copy</a> 这个工具能根据 Django 数据模型将批量数据导入到 PostgreSQL 数据库中。 <a href="http://www.californiacivicdata.org/2015/07/17/hello-django-postgres-copy/">对导入批量数据到 PostgreSQL 这个新开源软件的简介</a> 是关于如何在我们的项目中使用该工具的介绍性文章。</p>
</li>
<li>
<p><a href="http://nemesisdesign.net/blog/coding/how-to-speed-up-tests-django-postgresql/">如何提升 Django 和 PostgreSQL 的测试过程</a> 讲述的一些技巧能提升你的模式迁移后端的测试用例的运行速度。</p>
</li>
<li>
<p><a href="http://www.machinalis.com/blog/full-text-search-on-django-with-database-back-ends/">Django 使用数据库后端实现全文检索</a> 提供了针对 PostgreSQL 和 <a href="/mysql.html">MySQL</a> 的代码,用来实现将基本的全文检索功能加入到应用中。</p>
</li>
<li>
<p><a href="https://pypi.python.org/pypi/records/">Records</a> 对 psycopg2 驱动器进行了封装,它使直接 SQL 访问变得更加容易。相较于使用像 SQLAlchemy 这样的 <a href="/object-relational-mappers-orms.html">ORM</a>,如果你更偏好写 SQL 语句的话,值得一看。</p>
</li>
</ul>
<h2>通用 PostgreSQL 相关资源</h2>
<p>不是专门针对 Python 的 PostgreSQL 教程对于正确处理数据也是相当有帮助的。</p>
<ul>
<li>
<p><a href="https://russ.garrett.co.uk/talks/postgres-gds/">PostgreSQL: 好的方面</a> 是一份很好的概述性幻灯片,阐述了 PostgreSQL 为何是一个不错的关系型数据库。</p>
</li>
<li>
<p><a href="http://postgresweekly.com/">PostgreSQL 周刊</a> 是一份每周时讯,它的 PostgreSQL 资源来自网络的。</p>
</li>
<li>
<p><a href="http://rachbelaid.com/introduction-to-postgres-physical-storage/">PostgreSQL 物理存储简介</a> 对 PostgreSQL 文件存于磁盘何处、这些文件如何存储你的数据以及哪些映射对低层数据库结构起重要作用等知识点提供了可靠讲解。这篇文章通俗易懂,非常值得一读。</p>
</li>
<li>
<p>Braintree 写了有关他们 <a href="https://www.braintreepayments.com/braintrust/scaling-postgresql-at-braintree-four-years-of-evolution">扩展使用 PostgreSQL</a> 的经验。 这篇文章深入讲述了 Braintree 数据库使用的演进历程。</p>
</li>
<li>
<p>这篇文章对 <a href="http://hans.io/blog/2014/02/19/postgresql_connection/index.html">一个 PostgreSQL 连接所需的花费</a> 进行了预估。</p>
</li>
<li>
<p>没有绝对安全的说法,但是 IBM 的这篇文章讲述了 <a href="http://www.ibm.com/developerworks/library/os-postgresecurity/">如何加固一个 PostgreSQL 数据库</a>。</p>
</li>
<li>
<p><a href="http://instagram-engineering.tumblr.com/post/40781627982/handling-growth-with-postgres-5-tips-from-instagram">Postgres 处理数据增长</a>,Instagram 的技术团队就如何扩展 PostgreSQL 数据库设计给我们提供了 5 个具体方法。</p>
</li>
<li>
<p><a href="http://rob.conery.io/2015/02/09/inserting-using-new-record-postgres/">在 Postgres 中插入及使用一条新记录</a> 就许多开发人员用他们所选的 ORM 编写的一些操作语句,提供了等价的 SQL 语句。</p>
</li>
<li>
<p><a href="http://patshaughnessy.net/2014/10/13/following-a-select-statement-through-postgres-internals">通过一个 Select 语句来了解 Postgres 内部机理</a> 对查询过程涉及的 PostgreSQL 内部机制进行了精彩剖析。</p>
</li>
<li>
<p>如果你刚开始使用 PostgreSQL,这里有一份 <a href="https://eye.raze.mx/10-beginner-postgresql-tasks-you-should-know/">你应该知道如何去完成的 10 个初学者任务</a>。</p>
</li>
<li>
<p>题目虽然听起来有点浮夸,但也是一份很有用的列表 <a href="http://engineering.tilt.com/7-postgresql-data-migration-hacks/">你应该使用的 7 个 PostgreSQL 数据迁移技巧</a>。</p>
</li>
<li>
<p><a href="https://github.com/dhamaniasad/awesome-postgres">awesome-postgres</a> 上列出了专注于 PostgreSQL 的相关代码库、教程和时讯的资源列表。</p>
</li>
<li>
<p>虽然可以使用图形界面来操作 PostgreSQL,但是你最好还是花些时间来 <a href="http://phili.pe/posts/postgresql-on-the-command-line/">熟悉下命令行界面</a>。</p>
</li>
<li>
<p>数据库备份很重要,因为数据丢失的情况一定会发生。这篇文章讲解了 <a href="http://www.n2ws.com/blog/how-to-backup-your-aws-cloud-based-postgresql-database.html">如何对托管在 Amazon Web 服务 EC2 实例上的 PostgreSQL 数据进行备份</a>,如果你选择在云服务器上管理数据库的话。</p>
</li>
<li>
<p><a href="https://tech.zalando.com/blog/hack-to-terminate-tcp-conn-postgres/">如何修复僵死的 PostgreSQL 查询</a> 展示了当你无法中止一些 PostgreSQL 查询语句时所需的一些技巧。</p>
</li>
<li>
<p><a href="http://sdf.org/~riley/blog/2016/01/04/is-bi-directional-replication-bdr-in-postgres-transactional/">PostgreSQL 中的双向复制 (BDR) 是事务型的吗?</a> 对 BDR 这个相对晦涩的主题进行了探索,并得出最终结论:BDR 和具有最终一致性的数据存储类似,而与只将一致性作为需求的数据存储不同。</p>
</li>
<li>
<p><a href="https://github.com/spotify/postgresql-metrics">PostgreSQL-metrics</a> 是一个由 Spotify 的工程师开发的工具,它能从一个 PostgreSQL 数据库中抽取并输出度量信息。我们也可以对该工具进行扩展,从而提取出定制的度量信息。</p>
</li>
<li>
<p><a href="https://blog.andyet.com/2016/02/04/postgres-9.5-document-store-hybrid/">在 Postgres 9.5 中创建一个 文档-存储 混合数据库</a> 讲解了如何存储和查询 JSON 数据,以类似于 <a href="/no-sql-datastore.html">NoSQL 数据存储</a> 的方式操作。</p>
</li>
<li>
<p><a href="http://eftimov.net/postgresql-indexes-first-principles">PostgreSQL 索引: 基本原理</a> 详细讲解了什么是索引,其适用情况及如何在 PostgreSQL 中使用。</p>
</li>
<li>
<p>这篇 <a href="http://thebuild.com/presentations/pgha-fosdem-2016.pdf">关于 Web 应用高可用性的幻灯片</a> 对那些普遍运用于生产环境下的 Web 应用中的各色数据库配置进行了很好的概述。</p>
</li>
<li>
<p><a href="http://blog.heapanalytics.com/when-to-avoid-jsonb-in-a-postgresql-schema/">JSONB 数据类型</a> 在 PostgreSQL 9.4 中被引入,它使得存储半结构化的数据--这些之前由诸如 MongoDB 等 <a href="/no-sql-datastore.html">NoSQL 数据库</a> 处理的数据更加容易。但是,有时候并不适合使用 JSONB, <a href="http://blog.heapanalytics.com/when-to-avoid-jsonb-in-a-postgresql-schema/">这篇博客讲述了当时需避免使用这种列类型</a>。</p>
</li>
</ul>
<h3>PostgreSQL 监测与性能</h3>
<p>监测一个或多个 PostgreSQL 实例,然后对它们进行优化是一项罕见技能。如果你想在应用中处理这些问题,下面的一些资源能帮助你入门。</p>
<ul>
<li>
<p>这篇 <a href="http://russ.garrett.co.uk/2015/10/02/postgres-monitoring-cheatsheet/">PostgreSQL 监测指南</a> 对于了解需要监测什么及如何监测十分便捷有用。</p>
</li>
<li>
<p>Craig Kerstiens 写了一篇有关 <a href="http://www.craigkerstiens.com/2012/10/01/understanding-postgres-performance/">理解 PostgreSQL 性能</a> 的详细文章。</p>
</li>
<li>
<p><a href="https://tech.lendinghome.com/practical-guide-to-postgresql-optimizations-d7b9c2ad6a22">PostgreSQL 优化实践指南</a> 讲述了通过使用缓存大小、恢复配置和共享缓存来提高数据库性能。</p>
</li>
<li>
<p>这篇关于 <a href="http://www.geekytidbits.com/performance-tuning-postgres/">PostgreSQL 性能调优</a> 的文章,其内容覆盖了如何查找慢速查询、调整索引及修改查询使其运行更快。</p>
</li>
<li>
<p><a href="http://okigiveup.net/what-postgresql-tells-you-about-its-performance/">从 PostgreSQL 中获取性能信息</a> 讲解了如何收集常用的性能度量值,并提供了获取这些信息需要运行的查询语句。该文还讲述了性能监测及如何分析触发函数。</p>
</li>
<li>
<p><a href="https://github.com/nilenso/postgresql-monitoring">PostgreSQL 监测查询</a> 是一个有关 SQL 查询的简单的 GitHub 项目,它可运行于一个 PostgreSQL 实例来对其用量、缓存和膨胀进行侦测。</p>
</li>
</ul>
<h3>你想学习相关数据或 Web 应用的更多知识吗?</h3>
<div class="row">
<div class="col-md-4">
<div class="well select-next">
<a href="/databases.html" class="btn btn-success btn-full"><svg width="28" height="30" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1168 1216q0 33-23.5 56.5t-56.5 23.5-56.5-23.5-23.5-56.5 23.5-56.5 56.5-23.5 56.5 23.5 23.5 56.5zm256 0q0 33-23.5 56.5t-56.5 23.5-56.5-23.5-23.5-56.5 23.5-56.5 56.5-23.5 56.5 23.5 23.5 56.5zm112 160v-320q0-13-9.5-22.5t-22.5-9.5h-1216q-13 0-22.5 9.5t-9.5 22.5v320q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5-9.5t9.5-22.5zm-1230-480h1180l-157-482q-4-13-16-21.5t-26-8.5h-782q-14 0-26 8.5t-16 21.5zm1358 160v320q0 66-47 113t-113 47h-1216q-66 0-113-47t-47-113v-320q0-25 16-75l197-606q17-53 63-86t101-33h782q55 0 101 33t63 86l197 606q16 50 16 75z" fill="#fff"/></svg></a>
<p class="under-btn">告诉我有关标准关系型数据库的知识。</p> </div>
</div>
<div class="col-md-4">
<div class="well select-next">
<a href="/no-sql-datastore.html" class="btn btn-success btn-full"><svg width="34" height="30" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1151 960h316q-1-3-2.5-8t-2.5-8l-212-496h-708l-212 496q-1 2-2.5 8t-2.5 8h316l95 192h320zm513 30v482q0 26-19 45t-45 19h-1408q-26 0-45-19t-19-45v-482q0-62 25-123l238-552q10-25 36.5-42t52.5-17h832q26 0 52.5 17t36.5 42l238 552q25 61 25 123z" fill="#fff"/></svg></a>
<p class="under-btn">那些时髦的开发者一直谈论的 NoSQL 数据存储到底是什么?</p> </div>
</div>
<div class="col-md-4">
<div class="well select-next">
<a href="/web-frameworks.html" class="btn btn-success btn-full"><svg width="28" height="30" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M553 1399l-50 50q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l466-466q10-10 23-10t23 10l50 50q10 10 10 23t-10 23l-393 393 393 393q10 10 10 23t-10 23zm591-1067l-373 1291q-4 13-15.5 19.5t-23.5 2.5l-62-17q-13-4-19.5-15.5t-2.5-24.5l373-1291q4-13 15.5-19.5t23.5-2.5l62 17q13 4 19.5 15.5t2.5 24.5zm657 651l-466 466q-10 10-23 10t-23-10l-50-50q-10-10-10-23t10-23l393-393-393-393q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l466 466q10 10 10 23t-10 23z" fill="#fff"/></svg></a>
<p class="under-btn">我想学习如何用框架创建 Python Web 应用。</p> </div>
</div>
</div><div id="mc_embed_signup">
<form action="//mattmakai.us2.list-manage.com/subscribe/post?u=b7e774f0c4f05dcebbfee183d&id=b22335388d" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate>
<div id="mc_embed_signup_scroll">
<h4>在这里注册以便每月能收到一份邮件资料,内容包含本站的主要更新、教程和 Python 书籍的打折码等。</h4>
<div class="row">
<div class="col-md-9">
<input type="email" value="" name="EMAIL" class="email form-control" id="mce-EMAIL" placeholder="邮箱地址" required>
<div style="position: absolute; left: -5000px;"><input type="text" name="b_b7e774f0c4f05dcebbfee183d_b22335388d" tabindex="-1" value=""></div>
</div>
<div class="col-md-3">
<div class="clear"><input type="submit" value="订阅" name="subscribe" id="mc-embedded-subscribe" class="btn btn-success" style="font-family: 'Helvetica Neue';"></div>
</div>
</div>
</div>
</form>
</div>
</div>
<div class="col-md-offset-1 col-md-3" id="sidebar">
<div class="panel panel-success">
<div class="panel-body">
<a href="http://www.deploypython.com/"><img src="/img/sponsored/fsp-deployment-guide.png" alt="The Full Stack Python Guide to Deployments" width="100%"></a>
<p style="font-size: .8em; margin-top: 10px;">想找到一个完整的,一步一步的部署方案吗?请看<a href="http://www.deploypython.com/">《The Full Stack Python Guide to Deployments》</a>.
</p>
</div>
</div><div class="panel panel-success">
<div class="panel-heading">
<h3 class="panel-head">邮件获取更新</h3>
</div>
<div class="panel-body">
<div id="mc_embed_signup">
<form action="//mattmakai.us2.list-manage.com/subscribe/post?u=b7e774f0c4f05dcebbfee183d&id=b22335388d" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate>
<div id="mc_embed_signup_scroll">
<h5>注册以便每月能收到一份邮件资料,内容包含本站的主要更新和 Python 教程。</h5>
<input type="email" value="" name="EMAIL" class="email form-control" id="mce-EMAIL" placeholder="邮箱地址" required>
<div style="position: absolute; left: -5000px;"><input type="text" name="b_b7e774f0c4f05dcebbfee183d_b22335388d" tabindex="-1" value=""></div>
<input type="submit" value="订阅" name="subscribe" id="mc-embedded-subscribe" class="btn btn-success" style="font-family: 'Helvetica Neue'; margin-top: 5px;">
</div>
</form>
</div>
</div>
</div><div class="panel" id="full-toc">
<div class="panel-heading">
<h3 class="panel-head"><a href="/table-of-contents.html" style="color: #fff;">目录</a></h3>
</div>
<div class="list-group">
<a href="/introduction.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>1. 简介</a><a href="/learning-programming.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>学习编程</a><a href="/why-use-python.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>为什么用 Python?</a><a href="/python-2-or-3.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Python 2 还是 3?</a><a href="/enterprise-python.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>企业 Python</a><a href="/python-community.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Python Community</a><a href="/best-python-podcasts.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Best Python Podcasts</a><a href="/best-python-resources.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>最佳 Python 资源</a><a href="/best-python-videos.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>最佳 Python 视频</a><a href="/development-environments.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>2. 开发环境</a><a href="/vim.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Vim</a><a href="/emacs.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Emacs</a><a href="/python-programming-language.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>3. 核心语言</a><a href="/generators.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>生成器</a><a href="/comprehensions.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>推导式</a><a href="/web-development.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>4. Web 开发</a><a href="/web-frameworks.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Web 框架</a><a href="/django.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Django</a><a href="/flask.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Flask</a><a href="/bottle.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Bottle</a><a href="/pyramid.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Pyramid</a><a href="/morepath.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Morepath</a><a href="/other-web-frameworks.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>其它 Web 框架</a><a href="/web-design.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Web 设计</a><a href="/cascading-style-sheets.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>级联样式表 (CSS)</a><a href="/javascript.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>JavaScript</a><a href="/websockets.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>WebSockets</a><a href="/template-engines.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>模板引擎</a><a href="/web-application-security.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Web 应用安全</a><a href="/static-site-generator.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>静态网站生成器</a><a href="/jinja2.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Jinja2</a><a href="/data.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>5. 数据</a><a href="/databases.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>关系型数据库</a><a href="/no-sql-datastore.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>NoSQL 数据存储</a><a href="/object-relational-mappers-orms.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>对象关系映射器</a><a href="/postgresql.html" class="list-group-item smaller-item active" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>PostgreSQL</a><a href="/mysql.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>MySQL</a><a href="/sqlite.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>SQLite</a><a href="/application-programming-interfaces.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>6. Web APIs</a><a href="/api-integration.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>API 集成</a><a href="/api-creation.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>API 的创建</a><a href="/twilio.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Twilio</a><a href="/deployment.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>7. 部署</a><a href="/servers.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>服务器</a><a href="/platform-as-a-service.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>平台即服务(PaaS)</a><a href="/operating-systems.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>操作系统</a><a href="/web-servers.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Web 服务器</a><a href="/wsgi-servers.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>WSGI 服务器</a><a href="/source-control.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>源码控制</a><a href="/application-dependencies.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>应用程序依赖</a><a href="/static-content.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>静态内容</a><a href="/task-queues.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>任务队列</a><a href="/configuration-management.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>配置管理</a><a href="/continuous-integration.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>持续集成</a><a href="/logging.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>日志</a><a href="/monitoring.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>监控</a><a href="/web-analytics.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Web 分析</a><a href="/docker.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Docker</a><a href="/caching.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>缓存</a><a href="/microservices.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>微服务</a><a href="/devops.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>DevOps</a><a href="/nginx.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Nginx</a><a href="/apache-http-server.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Apache HTTP 服务器</a><a href="/caddy.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Caddy</a><a href="/green-unicorn-gunicorn.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Green Unicorn (Gunicorn)</a><a href="/ubuntu.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Ubuntu</a><a href="/pelican.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Pelican</a><a href="/lektor.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Lektor</a><a href="/mkdocs.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>MkDocs</a><a href="/testing.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>8. 测试</a><a href="/unit-testing.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>单元测试</a><a href="/integration-testing.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>集成测试</a><a href="/code-metrics.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>代码度量</a><a href="/debugging.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>调试</a><a href="/what-full-stack-means.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif;'>9. Meta</a><a href="/bots.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Bots</a><a href="/change-log.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Change Log</a><a href="/future-directions.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Future Directions</a><a href="/about-author.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>About the Author</a><a href="/sqlalchemy.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>SQLAlchemy</a><a href="/peewee.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",sans-serif; padding-left:27px'>Peewee</a> <a href="/table-of-contents.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",san-serif;background-color:#22B24C; color: #fff;'>...或者<span style="border-bottom: 1px dotted;">显示全部目录内容</span>.</a>
</div>
</div> <div class="panel">
<div class="panel-heading"><h3 class="panel-head">PostgreSQL</h3></div>
<div class="panel-body">
重要的更新内容会通过 Twitter 账号<a href="https://twitter.com/fullstackpython">@fullstackpython</a>发布。
<hr/>
需要更加详细的教程吗?请看
<a href="http://www.deploypython.com/">《The Full Stack Python Guide to Deployments》。</a>
</div>
</div>
<div class="panel" id="mobile-toc">
<div class="panel-heading">
<h3 class="panel-head"><a href="/table-of-contents.html" style="color: #fff;">Chapters</a></h3>
</div>
<div class="list-group">
<a href="/introduction.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>1. 简介</a><a href="/development-environments.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>2. 开发环境</a><a href="/python-programming-language.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>3. 核心语言</a><a href="/web-development.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>4. Web 开发</a><a href="/data.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>5. 数据</a> <a href="/postgresql.html" class="list-group-item smaller-item active" style='font-family: "Helvetica Neue",sans-serif;'>» PostgreSQL</a>
<a href="/application-programming-interfaces.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>6. Web APIs</a><a href="/deployment.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>7. 部署</a><a href="/testing.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>8. 测试</a><a href="/what-full-stack-means.html" class="list-group-item smaller-item " style='font-family: "Helvetica Neue",sans-serif;'>9. Meta</a> <a href="/table-of-contents.html" class="list-group-item smaller-item" style='font-family: "Helvetica Neue",san-serif;background-color:#22B24C; color: #fff;'>...or <span style="border-bottom: 1px dotted;">view the full table of contents</span>.</a>
</div>
</div></div></div>
<hr/>
</div>
<div class="container">
<div class="footer pull-right">
<a href="http://www.fullstackpython.com/">Original Version(English) </a>By
<a href="http://www.mattmakai.com/" class="underline">Matt Makai</a>
2016
</div>
</div>
<div class="container">
<div class="footer pull-right" style="text-align:right; font-size:85%;">
<p>此网站由 <a href="https://github.com/haiiiiiyun">@haiiiiiyun</a> 维护,由
<a href="https://github.com/haiiiiiyun/fullstackpython.cn/graphs/contributors">开源爱好者们</a> 共同翻译。
若发现错误或想贡献翻译,请访问: <a href="https://github.com/haiiiiiyun/fullstackpython.cn/">Github fullstackpython.cn 项目</a>
</p>
</div>
</div><script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-77551377-2', 'auto');
ga('send', 'pageview');
</script><script type='text/javascript'>
var trackOutboundLink = function(url) { ga('send', 'event', 'outbound', 'click', url, {'hitCallback': function () { document.location = url; } }); }
</script>
</body>
</html>