/
778.txt
261 lines (214 loc) · 9.95 KB
/
778.txt
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
[4] [[データベース]]を表す [[URL scheme]] がいくつか使われています。
[2]
[FIG(short list)[
- [CODE(URI)@en[[[db:]]]]
- [CODE(URI)@en[dbase:]]
- [CODE(URI)@en[fbsql:]]
- [CODE(URI)@en[[[jdbc:]]]]
- [CODE(URI)@en[[[mysql:]]]]
- [CODE(URI)@en[mysql+zxjdbc:]]
- [CODE(URI)@en[mysql+mysqlconnector:]]
- [CODE(URI)@en[mysql+cymysql:]]
- [CODE(URI)@en[mysql+pymysql:]]
- [CODE(URI)@en[mysql+gaerdbms:]]
- [CODE(URI)@en[mysql+pyodbc:]]
- [CODE(URI)@en[mysql+mysqldb:]]
- [CODE(URI)@en[mysql2:]]
- [CODE(URI)@en[mysqli:]]
- [CODE(URI)@en[mysqlgis:]]
- [CODE(URI)@en[msql:]]
- [CODE(URI)@en[mssql:]]
- [CODE(URI)@en[ibase:]]
- [CODE(URI)@en[ifx:]]
- [CODE(URI)@en[oci8:]]
- [CODE(URI)@en[odbc:]]
- [CODE(URI)@en[odbc(access):]]
- [CODE(URI)@en[[[oracle:]]]]
- [CODE(URI)@en[[[redis:]]]]
- [CODE(URI)@en[[[rediss:]]]]
- [CODE(URI)@en[sqlite:]]
- [CODE(URI)@en[sqlite3:]]
- [CODE(URI)@en[pgsql:]]
- [CODE(URI)@en[postgres:]]
- [CODE(URI)@en[postgresql]]
- [CODE(URI)@en[sybase:]]
]FIG]
* 意味
[5] 多くの [[URL]] は、接続先の[[データベース]]を表しています。
すなわち、[[データベース]]へ接続するために必要な[[プロトコル]]、
[[ホスト]]、[[データベース]]名、接続オプションなどを [[URL]]
に含めています。
[7] [[データベース]]内のデータにまで[[アドレス付け]]している [[URL scheme]]
は今のところなさそうです。
* 標準化
[6] あらゆる点でほとんど[[実装依存]]であり、[[標準化]]の動きもありません。
みな似たような構文と意味に収まっていますが、細かい点に色々と違いがありそうです。
* 環境変数 [CODE[DATABASE_URL]]
[14] [[Ruby on Rails]] は[[設定ファイル]]内で接続先の[[データベース]]を [[URL]]
で指定できるとしています。加えて、[[環境変数]] [DFN[[CODE[DATABASE_URL]]]]
によって指定する方法も提供しています。
* 歴史
[8] [[ODBC]] や [[Perlモジュール]]の [[DBI]] は、接続先の[[データベース]]の種類
([[プロトコル]]) によらず (ほぼ) 共通化された構文の[[接続文字列][ODBC DSN]]や
[[DSN][DBI DSN]] を採用していました。
これが単一の[[文字列]]によって接続先[[データベース]]の記述を統合的に扱おうとした事例のはしりなのでしょうが、
[[接続文字列]]は構文的に [[URL]] とまったく異なっていましたし、
[[DSN][DBI DSN]] も [[URL]] とは見なされていませんでした。
* メモ
[9] [[データベース]]へ接続するためには[[ホスト]]、[[プロトコル]]、
[[データベース名]]など色々なオプションを指定しなければなりません。
[[データベース]]を扱う[[アプリケーション]]の起動時や設定ファイルでこれを一々指定するのも中々大変ですし、
複数の[[データベース]]に接続する巨大な[[アプリケーション]]では[[データベース]]管理だけで一苦労です。
その点、 [[URL]] のようにこうした指定を1つの[[文字列]]にまとめられると、
[[データベース]]ごとに1[[文字列]]を指定できるようにすれば良いだけなので、
[[開発者]]も[[運用]]担当者も楽になります。
[1] [CITE@en[Engine Configuration — SQLAlchemy 0.9 Documentation]]
([TIME[2015-07-06 00:17:46 +09:00]] 版)
<http://docs.sqlalchemy.org/en/rel_0_9/core/engines.html#database-urls>
[FIG(quote)[
[FIGCAPTION[
[3] [CITE[Data Services — Stackato 3.0.1 documentation]]
([TIME[2015-07-03 07:24:32 +09:00]] 版)
<http://docs.stackato.com/3.0/user/services/data-services.html#database-url>
]FIGCAPTION]
> It contains the connection string for the bound database in the following format:
> protocol://username:password@host:port/database_name
]FIG]
[FIG(quote)[
[FIGCAPTION[
[10] [CITE@en[Welcome to Django-environ’s documentation! — Django-environ 0.4.0 documentation]]
([TIME[2015-09-24 01:20:50 +09:00]])
<https://django-environ.readthedocs.io/en/latest/>
]FIGCAPTION]
> db_url
> PostgreSQL: postgres://, pgsql://, psql:// or postgresql://
> PostGIS: postgis://
> MySQL: mysql:// or mysql2://
> MySQL for GeoDjango: mysqlgis://
> SQLITE: sqlite://
> SQLITE with SPATIALITE for GeoDjango: spatialite://
> LDAP: ldap://
> cache_url
> Database: dbcache://
> Dummy: dummycache://
> File: filecache://
> Memory: locmemcache://
> Memcached: memcache://
> Python memory: pymemcache://
> Redis: rediscache://
> search_url
> ElasticSearch: elasticsearch://
> Solr: solr://
> Whoosh: whoosh://
> Xapian: xapian://
> Simple cache: simple://
> email_url
> SMTP: smtp://
> SMTP+SSL: smtp+ssl://
> SMTP+TLS: smtp+tls://
> Console mail: consolemail://
> File mail: filemail://
> LocMem mail: memorymail://
> Dummy mail: dummymail://
]FIG]
[11] [CITE@en[seamusabshere/database_url: Convert back and forth between Heroku-style ENV'''[''''DATABASE_URL'''']''' and Rails/ActiveRecord-style config/database.yml hashes.]]
([TIME[2016-11-17 22:59:11 +09:00]])
<https://github.com/seamusabshere/database_url>
[FIG(quote)[
[FIGCAPTION[
[12] [CITE@en[Riding Rails: Rails 4.1.0: Spring, Variants, Enums, Mailer previews, secrets.yml]]
([TIME[2016-11-15 19:24:16 +09:00]])
<http://weblog.rubyonrails.org/2014/4/8/Rails-4-1/>
]FIGCAPTION]
> Second is that we’ve added support for database URLs in database.yml, and that we by default will be referring to ENV-backed URLs in the generated files.
]FIG]
[13] [CITE@en-us[John Griffin: Rails 4.1: Database URLs]]
([[John Griffin]]著, [TIME[2015-02-16 04:36:58 +09:00]])
<http://www.johng.co.uk/2014/04/29/rails-41-database-urls/>
[FIG(quote)[
[FIGCAPTION[
[15] [CITE@en[Environment Variables - GitLab Documentation]]
([TIME[2016-11-17 23:03:20 +09:00]])
<https://docs.gitlab.com/ce/administration/environment_variables.html>
]FIGCAPTION]
> DATABASE_URL string The database URL; is of the form: postgresql://localhost/blog_development
]FIG]
[FIG(quote)[
[FIGCAPTION[
[16] [CITE@en[Environment Variables - GitLab Documentation]]
([TIME[2016-11-17 23:03:20 +09:00]])
<https://docs.gitlab.com/ce/administration/environment_variables.html>
]FIGCAPTION]
> The recommended way of specifying your database connection information is to set the DATABASE_URL environment variable. This variable only holds connection information (adapter, database, username, password, host and port), but not behavior information (encoding, pool). If you don't want to use DATABASE_URL and/or want to set database behavior information, you will have to either:
> copy our template file: cp config/database.yml.env config/database.yml, or
> set a value for some GITLAB_DATABASE_XXX variables
]FIG]
[FIG(quote)[
[FIGCAPTION[
[17] [CITE[Manual :: The Data Source Name]]
([TIME[2016-11-17 23:50:11 +09:00]])
<http://pear.php.net/manual/en/package.database.db.intro-dsn.php>
]FIGCAPTION]
> To connect to a database through PEAR::DB, you have to create a valid DSN - data source name. This DSN consists in the following parts:
> phptype: Database backend used in PHP (i.e. mysql , odbc etc.)
> dbsyntax: Database used with regards to SQL syntax etc. When using ODBC as the phptype, set this to the DBMS type the ODBC driver is connecting to. Examples: access, db2, mssql, navision, solid, etc.
> protocol: Communication protocol to use ( i.e. tcp, unix etc.)
> hostspec: Host specification (hostname'''[''':port''']''')
> database: Database to use on the DBMS server
> username: User name for login
> password: Password for login
> proto_opts: Maybe used with protocol
> option: Additional connection options in URI query string format. options get separated by &
> The format of the supplied DSN is in its fullest form:
> phptype(dbsyntax)://username:password@protocol+hostspec/database?option=value
> Most variations are allowed:
> phptype://username:password@protocol+hostspec:110//usr/db_file.db
> phptype://username:password@hostspec/database
> phptype://username:password@hostspec
> phptype://username@hostspec
> phptype://hostspec/database
> phptype://hostspec
> phptype:///database
> phptype:///database?option=value&anotheroption=anothervalue
> phptype(dbsyntax)
> phptype
> The currently supported database backends are:
> dbase -> dBase
> fbsql -> FrontBase (functional since DB 1.7.0)
> ibase -> InterBase (functional since DB 1.7.0)
> ifx -> Informix
> msql -> Mini SQL (functional since DB 1.7.0)
> mssql -> Microsoft SQL Server (NOT for Sybase. Compile PHP --with-mssql)
> mysql -> MySQL (for MySQL <= 4.0)
> mysqli -> MySQL (for MySQL >= 4.1) (requires PHP 5) (since DB 1.6.3)
> oci8 -> Oracle 7/8/9
> odbc -> ODBC (Open Database Connectivity)
> pgsql -> PostgreSQL
> sqlite -> SQLite
> sybase -> Sybase
> With an up-to-date version of DB, you can use a second DSN format
> phptype(syntax)://user:pass@protocol(proto_opts)/database
]FIG]
[FIG(quote)[
[FIGCAPTION[
[18] [CITE@en[go-sql-driver/mysql: Go MySQL Driver is a lightweight and fast MySQL driver for Go's (golang) database/sql package]]
([TIME[2016-11-17 23:58:36 +09:00]])
<https://github.com/go-sql-driver/mysql>
]FIGCAPTION]
> The Data Source Name has a common format, like e.g. PEAR DB uses it, but without type-prefix (optional parts marked by squared brackets):
> '''['''username'''[''':password''']'''@''']''''''['''protocol'''['''(address)''']'''''']'''/dbname'''['''?param1=value1&...¶mN=valueN''']'''
> A DSN in its fullest form:
> username:password@protocol(address)/dbname?param=value
]FIG]
[FIG(quote)[
[FIGCAPTION[
[19] [CITE[The DB-URI — TurboGears 1.0 documentation]]
([TIME[2013-01-12 16:52:59 +09:00]])
<http://turbogears.org/1.0/docs/DbUri.html>
]FIGCAPTION]
> postgres://username@hostname/databasename
> mysql://username:password@hostname:port/databasename
> sqlite://path/to/file
> postgres:///var/run/postgresql/test?debug=1
> mysql://localhost/database?unix_socket=/var/lib/mysql/socket
]FIG]