ktsn-ud commited on
Commit
a3a0745
·
1 Parent(s): 4a729bd

PostgreSQLからMySQLに移行

Browse files
app/db/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
- """Database utilities for CockroachDB connections."""
2
 
3
  __all__ = ["session"]
 
1
+ """Database utilities for MySQL connections."""
2
 
3
  __all__ = ["session"]
app/db/session.py CHANGED
@@ -1,16 +1,18 @@
1
  import os
2
  from contextlib import contextmanager
 
3
  from threading import Lock
4
  from typing import Iterator, Optional
 
5
 
6
- from psycopg import Connection
7
- from psycopg_pool import ConnectionPool
8
 
9
  from dotenv import load_dotenv
10
 
11
  load_dotenv()
12
 
13
- _pool: Optional[ConnectionPool] = None
14
  _pool_lock = Lock()
15
 
16
 
@@ -22,15 +24,156 @@ def _get_env(name: str, default: Optional[str] = None) -> Optional[str]:
22
  return trimmed or default
23
 
24
 
25
- def _build_connect_kwargs() -> dict:
26
- ssl_root_cert = _get_env("SSL_ROOT_CERT")
27
- kwargs: dict = {}
28
- if ssl_root_cert:
29
- kwargs["sslrootcert"] = ssl_root_cert
30
- return kwargs
31
 
 
 
 
 
 
 
 
32
 
33
- def _ensure_pool() -> ConnectionPool:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  global _pool
35
  if _pool is not None:
36
  return _pool
@@ -43,16 +186,14 @@ def _ensure_pool() -> ConnectionPool:
43
  if not database_url:
44
  raise RuntimeError("DATABASE_URL is not set")
45
 
 
46
  min_size = int(_get_env("DB_POOL_MIN_SIZE", "1"))
47
  max_size = int(_get_env("DB_POOL_MAX_SIZE", "5"))
48
- # max_waiting = float(_get_env("DB_POOL_MAX_WAIT", "5.0"))
49
 
50
- pool = ConnectionPool(
51
- conninfo=database_url,
52
  min_size=min_size,
53
  max_size=max_size,
54
- # max_waiting=max_waiting,
55
- kwargs=_build_connect_kwargs(),
56
  )
57
  _pool = pool
58
  return pool
@@ -62,9 +203,6 @@ def _ensure_pool() -> ConnectionPool:
62
  def get_connection() -> Iterator[Connection]:
63
  pool = _ensure_pool()
64
  with pool.connection() as conn:
65
- # CockroachDB はトランザクション分離レベル SERIALIZABLE が既定。
66
- # 読み取り専用用途なのでオートコミットに切り替える。
67
- conn.autocommit = True
68
  yield conn
69
 
70
 
 
1
  import os
2
  from contextlib import contextmanager
3
+ from queue import Empty, Full, Queue
4
  from threading import Lock
5
  from typing import Iterator, Optional
6
+ from urllib.parse import parse_qs, unquote, urlparse
7
 
8
+ import pymysql
9
+ from pymysql.connections import Connection
10
 
11
  from dotenv import load_dotenv
12
 
13
  load_dotenv()
14
 
15
+ _pool: Optional["MySQLConnectionPool"] = None
16
  _pool_lock = Lock()
17
 
18
 
 
24
  return trimmed or default
25
 
26
 
27
+ def _str_to_bool(value: str) -> bool:
28
+ return value.lower() in {"1", "true", "yes", "on"}
29
+
 
 
 
30
 
31
+ def _parse_database_url(database_url: str) -> dict:
32
+ parsed = urlparse(database_url)
33
+ scheme = parsed.scheme.lower()
34
+ if scheme not in {"mysql", "mysql+pymysql"}:
35
+ raise RuntimeError(
36
+ "DATABASE_URL must use the mysql scheme when PyMySQL is in use"
37
+ )
38
 
39
+ database = parsed.path.lstrip("/")
40
+ if not database:
41
+ raise RuntimeError("DATABASE_URL must include the database name")
42
+
43
+ connect_kwargs = {
44
+ "host": parsed.hostname or "localhost",
45
+ "port": parsed.port or 3306,
46
+ "user": unquote(parsed.username or ""),
47
+ "password": unquote(parsed.password or ""),
48
+ "database": database,
49
+ "charset": _get_env("DB_CHARSET", "utf8mb4"),
50
+ "autocommit": True,
51
+ }
52
+
53
+ connect_timeout = _get_env(
54
+ "DB_CONNECT_TIMEOUT"
55
+ ) # TODO: DB_CONNECT_TIMEOUTのenv追加
56
+ if connect_timeout:
57
+ connect_kwargs["connect_timeout"] = float(connect_timeout)
58
+
59
+ ssl_root_cert = _get_env("SSL_ROOT_CERT") # TODO: SSL_ROOT_CERTのenv追加
60
+ if ssl_root_cert:
61
+ connect_kwargs["ssl"] = {"ca": ssl_root_cert}
62
+
63
+ query_params = parse_qs(parsed.query, keep_blank_values=True)
64
+ for key, values in query_params.items():
65
+ if not values:
66
+ continue
67
+ value = values[-1]
68
+ if key == "autocommit":
69
+ connect_kwargs["autocommit"] = _str_to_bool(value)
70
+ elif key == "charset":
71
+ connect_kwargs["charset"] = value
72
+ elif key == "connect_timeout":
73
+ connect_kwargs["connect_timeout"] = float(value)
74
+ else:
75
+ connect_kwargs[key] = value
76
+
77
+ return {key: val for key, val in connect_kwargs.items() if val not in {None, ""}}
78
+
79
+
80
+ class MySQLConnectionPool:
81
+ """Simple thread-safe connection pool for PyMySQL."""
82
+
83
+ def __init__(self, connect_kwargs: dict, min_size: int, max_size: int) -> None:
84
+ if min_size < 0:
85
+ raise ValueError("min_size must be non-negative")
86
+ if max_size < 1:
87
+ raise ValueError("max_size must be at least 1")
88
+ if min_size > max_size:
89
+ raise ValueError("min_size cannot exceed max_size")
90
+
91
+ self._connect_kwargs = connect_kwargs
92
+ self._available: Queue[Connection] = Queue(maxsize=max_size)
93
+ self._lock = Lock()
94
+ self._max_size = max_size
95
+ self._total_created = 0
96
+ self._closed = False
97
+
98
+ for _ in range(min_size):
99
+ conn = self._create_connection()
100
+ self._available.put(conn)
101
+ self._total_created += 1
102
+
103
+ def _create_connection(self) -> Connection:
104
+ if self._closed:
105
+ raise RuntimeError("Connection pool is closed")
106
+ return pymysql.connect(**self._connect_kwargs)
107
+
108
+ def connection(self):
109
+ return _PooledConnectionContext(self)
110
+
111
+ def acquire(self) -> Connection:
112
+ while True:
113
+ try:
114
+ conn = self._available.get_nowait()
115
+ except Empty:
116
+ with self._lock:
117
+ if self._total_created < self._max_size:
118
+ conn = self._create_connection()
119
+ self._total_created += 1
120
+ return conn
121
+ conn = self._available.get()
122
+
123
+ if conn.open:
124
+ conn.ping(reconnect=True)
125
+ conn.autocommit(True)
126
+ return conn
127
+ self._discard_connection(conn)
128
+
129
+ def release(self, conn: Connection) -> None:
130
+ if self._closed:
131
+ self._discard_connection(conn)
132
+ return
133
+
134
+ if not conn.open:
135
+ self._discard_connection(conn)
136
+ return
137
+
138
+ try:
139
+ self._available.put_nowait(conn)
140
+ except Full:
141
+ self._discard_connection(conn)
142
+
143
+ def close(self) -> None:
144
+ self._closed = True
145
+ while True:
146
+ try:
147
+ conn = self._available.get_nowait()
148
+ except Empty:
149
+ break
150
+ self._discard_connection(conn)
151
+
152
+ def _discard_connection(self, conn: Connection) -> None:
153
+ try:
154
+ conn.close()
155
+ finally:
156
+ with self._lock:
157
+ if self._total_created > 0:
158
+ self._total_created -= 1
159
+
160
+
161
+ class _PooledConnectionContext:
162
+ def __init__(self, pool: MySQLConnectionPool) -> None:
163
+ self._pool = pool
164
+ self._conn: Optional[Connection] = None
165
+
166
+ def __enter__(self) -> Connection:
167
+ self._conn = self._pool.acquire()
168
+ return self._conn
169
+
170
+ def __exit__(self, exc_type, exc, tb) -> None:
171
+ if self._conn is not None:
172
+ self._pool.release(self._conn)
173
+ self._conn = None
174
+
175
+
176
+ def _ensure_pool() -> MySQLConnectionPool:
177
  global _pool
178
  if _pool is not None:
179
  return _pool
 
186
  if not database_url:
187
  raise RuntimeError("DATABASE_URL is not set")
188
 
189
+ connect_kwargs = _parse_database_url(database_url)
190
  min_size = int(_get_env("DB_POOL_MIN_SIZE", "1"))
191
  max_size = int(_get_env("DB_POOL_MAX_SIZE", "5"))
 
192
 
193
+ pool = MySQLConnectionPool(
194
+ connect_kwargs=connect_kwargs,
195
  min_size=min_size,
196
  max_size=max_size,
 
 
197
  )
198
  _pool = pool
199
  return pool
 
203
  def get_connection() -> Iterator[Connection]:
204
  pool = _ensure_pool()
205
  with pool.connection() as conn:
 
 
 
206
  yield conn
207
 
208
 
app/repositories/_data_example.py CHANGED
@@ -1,3550 +1,46 @@
1
  from uuid import UUID
2
 
3
  [
4
- (
5
- UUID("cbd30506-3726-4000-a5e9-82831b9361b8"),
6
- "マジックサークル",
7
- "まじっくさーくる",
8
- "マジックショー",
9
- None,
10
- True,
11
- True,
12
- True,
13
- "G4-21",
14
- None,
15
- None,
16
- None,
17
- "11/1 は準備を実施\n11/2 で3ステージ\n11/3 に2ステージ実施予定",
18
- None,
19
- [],
20
- [],
21
- ),
22
- (
23
- UUID("5fdbd51d-9724-4c00-afed-ea8ecb926d0f"),
24
- "Fファン",
25
- "えふふぁん",
26
- "自作ボードゲーム体験会!!",
27
- "PARTICIPATORY",
28
- True,
29
- True,
30
- True,
31
- "院演習室2",
32
- None,
33
- None,
34
- None,
35
- None,
36
- None,
37
- [],
38
- [],
39
- ),
40
- (
41
- UUID("64c0e365-74a0-4c00-b260-71b2ba506d9e"),
42
- "music society 道しるべ",
43
- "みゅーじっくそさいえてぃみちしるべ",
44
- "music society 道しるべ",
45
- None,
46
- False,
47
- True,
48
- False,
49
- "D2 10:30~11:00",
50
- None,
51
- None,
52
- None,
53
- None,
54
- None,
55
- [],
56
- [],
57
- ),
58
- (
59
- UUID("d095fe58-f65b-4800-a84a-ff2c7b2db583"),
60
- "Soundhouse ZOO",
61
- "さうんどはうすずー",
62
- "ZOO教室ライブ",
63
- None,
64
- True,
65
- True,
66
- True,
67
- "G4-42",
68
- None,
69
- None,
70
- None,
71
- "要防音対策",
72
- None,
73
- [],
74
- [],
75
- ),
76
- (
77
- UUID("f106b4d9-df12-4800-b883-5a6cef894209"),
78
- "Soundhouse ZOO",
79
- "さうんどはうすずー",
80
- "ZOOステージライブ",
81
- None,
82
- False,
83
- True,
84
- False,
85
- "D2 9:30~10:00",
86
- None,
87
- None,
88
- None,
89
- None,
90
- None,
91
- [],
92
- [],
93
- ),
94
- (
95
- UUID("28ca9fc2-4241-4000-9465-4fe12120f7cd"),
96
- "Ubojchor",
97
- "うぼいこーる",
98
- "Ubojchorのバンド演奏",
99
- None,
100
- True,
101
- True,
102
- True,
103
- "G4-41",
104
- None,
105
- None,
106
- None,
107
- "11/1 AMは準備を実施\n要防音対策",
108
- None,
109
- [],
110
- [],
111
- ),
112
- (
113
- UUID("c37f8674-f0b9-4000-a1bf-c33a785cf09a"),
114
- "Ubojchor",
115
- "うぼいこーる",
116
- "フレデリック、筋肉少女帯",
117
- None,
118
- False,
119
- True,
120
- True,
121
- "D2 9:00~9:30, D3 10:30~11:00",
122
- None,
123
- None,
124
- None,
125
- None,
126
- None,
127
- [],
128
- [],
129
- ),
130
- (
131
- UUID("be8ebd70-e054-4000-9f47-5eb8702a0f01"),
132
- "アイドルマスター研究会",
133
- "あいどるますたーけんきゅうかい",
134
- "278プロダクション",
135
- None,
136
- True,
137
- True,
138
- True,
139
- "G4-33",
140
- None,
141
- None,
142
- None,
143
- "ラブライブ研究会との相部屋",
144
- None,
145
- [],
146
- [],
147
- ),
148
- (
149
- UUID("8bbcf40f-1f98-4800-85de-7a078fcc4448"),
150
- "アニメーション研究会",
151
- "あにめーしょんけんきゅうかい",
152
- "自主制作アニメ上映会",
153
- None,
154
- False,
155
- False,
156
- False,
157
- "G4-34",
158
- None,
159
- None,
160
- None,
161
- None,
162
- None,
163
- [],
164
- [],
165
- ),
166
- (
167
- UUID("8a70d8ff-1e38-4800-8538-6c7f8f1c431d"),
168
- "アンプラグド",
169
- "あんぷらぐど",
170
- "アンプラ大祭ライブ",
171
- None,
172
- True,
173
- True,
174
- True,
175
- "G4-44",
176
- None,
177
- None,
178
- None,
179
- None,
180
- None,
181
- [],
182
- [],
183
- ),
184
- (
185
- UUID("3ac34750-4f79-4a00-9d61-a3a827bcc55e"),
186
- "アンプラグド",
187
- "あんぷらぐど",
188
- "アンプラグド",
189
- None,
190
- False,
191
- False,
192
- True,
193
- "D3 9:00~9:30",
194
- None,
195
- None,
196
- None,
197
- None,
198
- None,
199
- [],
200
- [],
201
- ),
202
- (
203
- UUID("ecf01fa4-f824-4800-b678-0fd27c123d8b"),
204
- "お笑いサークルP-RITTS",
205
- "おわらいさーくるぷりっつ",
206
- "P-RITTS\u3000大学祭ライブ",
207
- None,
208
- True,
209
- True,
210
- True,
211
- "G5-21",
212
- None,
213
- None,
214
- None,
215
- None,
216
- None,
217
- [],
218
- [],
219
- ),
220
- (
221
- UUID("fe0f1927-d890-4000-bf07-8c93ec482801"),
222
- "お笑いサークルP-RITTS",
223
- "おわらいさーくるぷりっつ",
224
- "P-RITTS\u3000ステージ漫才ライブ",
225
- None,
226
- False,
227
- True,
228
- False,
229
- "D2 16:30~17:00",
230
- None,
231
- None,
232
- None,
233
- None,
234
- None,
235
- [],
236
- [],
237
- ),
238
- (
239
- UUID("7073349d-90c5-4c00-b839-9a4ec862bd41"),
240
- "コンフローレ室内合奏団",
241
- "こんふろーれしつないがっそうだん",
242
- "アンサンブルコンサート",
243
- None,
244
- True,
245
- True,
246
- True,
247
- "G5-20",
248
- None,
249
- None,
250
- None,
251
- None,
252
- None,
253
- [],
254
- [],
255
- ),
256
- (
257
- UUID("20376c91-3af5-4c00-901b-b6489d7a95e0"),
258
- "シネマウント・フィルム・パーティー",
259
- "しねまうんとふぃるむぱーてぃー",
260
- "シネマウント出張上映会",
261
- None,
262
- True,
263
- True,
264
- True,
265
- "G4-34",
266
- None,
267
- None,
268
- None,
269
- None,
270
- None,
271
- [],
272
- [],
273
- ),
274
- (
275
- UUID("c90be32d-d046-4800-a485-f196e8235a6f"),
276
- "チェス研究会",
277
- "ちぇすけんきゅうかい",
278
- "ボードゲーム・TRPG体験",
279
- None,
280
- True,
281
- True,
282
- True,
283
- "L1-演習室22",
284
- None,
285
- None,
286
- None,
287
- None,
288
- None,
289
- [],
290
- [],
291
- ),
292
- (
293
- UUID("35755b1e-44fb-4e00-9aba-ad8f227dd6ff"),
294
- "ちばポケ@千葉大学ポケモンサークル",
295
- "ちばぽけあっとまーくちばだいがくぽけもんさーくる",
296
- "ちばポケスタンプラリー",
297
- None,
298
- True,
299
- True,
300
- True,
301
- "未設定",
302
- None,
303
- None,
304
- None,
305
- None,
306
- None,
307
- [],
308
- [],
309
- ),
310
- (
311
- UUID("706717d6-06da-4800-b833-8beb036d53ab"),
312
- "ちばポケ@千葉大学ポケモンサークル",
313
- "ちばぽけあっとまーくちばだいがくぽけもんさーくる",
314
- "ちばポケフェスティバル2025",
315
- None,
316
- True,
317
- True,
318
- True,
319
- "G4-31",
320
- None,
321
- None,
322
- None,
323
- None,
324
- None,
325
- [],
326
- [],
327
- ),
328
- (
329
- UUID("cda6e8a5-bb7c-4000-a6d3-7452ddbe69eb"),
330
- "ショパンの会",
331
- "しょぱんのかい",
332
- "ピアノカフェ",
333
- None,
334
- True,
335
- True,
336
- True,
337
- "G3-12",
338
- None,
339
- None,
340
- None,
341
- None,
342
- None,
343
- [],
344
- [],
345
- ),
346
- (
347
- UUID("632e3025-dc29-4800-b197-1812ee14b344"),
348
- "マンドリンクラブ",
349
- "まんどりんくらぶ",
350
- "Mandolin Concert",
351
- None,
352
- True,
353
- True,
354
- True,
355
- "G4-44",
356
- None,
357
- None,
358
- None,
359
- None,
360
- None,
361
- [],
362
- [],
363
- ),
364
- (
365
- UUID("4e760931-195c-4c00-a73b-04988cae2e80"),
366
- "マンドリンクラブ",
367
- "まんどりんくらぶ",
368
- "Churros tremolo",
369
- None,
370
- True,
371
- True,
372
- True,
373
- "理-01",
374
- None,
375
- None,
376
- None,
377
- None,
378
- None,
379
- [],
380
- [],
381
- ),
382
- (
383
- UUID("053148f5-0990-4740-8298-a47a84c83b9d"),
384
- "モダンジャズ研究会",
385
- "もだんじゃずけんきゅうかい",
386
- "モダンジャズ研究会演奏会",
387
- None,
388
- True,
389
- True,
390
- True,
391
- "G5-31",
392
- None,
393
- None,
394
- None,
395
- None,
396
- None,
397
- [],
398
- [],
399
- ),
400
- (
401
- UUID("4f18aaf7-21aa-4000-a78c-557b90d520c4"),
402
- "モダンジャズ研究会",
403
- "もだんじゃずけんきゅうかい",
404
- "モダンジャズ研究会",
405
- None,
406
- False,
407
- True,
408
- False,
409
- "D2 11:00~11:30",
410
- None,
411
- None,
412
- None,
413
- None,
414
- None,
415
- [],
416
- [],
417
- ),
418
- (
419
- UUID("44cd590d-8bb6-4800-a266-ac86c5db5b55"),
420
- "リコーダーアンサンブル",
421
- "りこーだーあんさんぶる",
422
- "リコーダーアンサンブル定期演奏会",
423
- None,
424
- False,
425
- True,
426
- True,
427
- "G5-42",
428
- None,
429
- None,
430
- None,
431
- None,
432
- None,
433
- [],
434
- [],
435
- ),
436
- (
437
- UUID("dd9b854a-c6c3-4800-aecd-c2a56361eab5"),
438
- "管弦楽団",
439
- "かんげんがくだん",
440
- "カンタービレタイム",
441
- None,
442
- True,
443
- True,
444
- True,
445
- "L1-103",
446
- None,
447
- None,
448
- None,
449
- None,
450
- None,
451
- [],
452
- [],
453
- ),
454
- (
455
- UUID("d16a541a-5046-4800-a8b5-2a0d28231267"),
456
- "技術教育研究室",
457
- "ぎじゅつきょういくけんきゅうしつ",
458
- "木-ホルダー工房",
459
- None,
460
- True,
461
- True,
462
- True,
463
- "共通演習室3",
464
- None,
465
- None,
466
- None,
467
- None,
468
- None,
469
- [],
470
- [],
471
- ),
472
- (
473
- UUID("925c0eb1-05e7-4800-892e-075882f3a297"),
474
- "競技麻雀部",
475
- "きょうぎまーじゃんぶ",
476
- "チバジャン",
477
- None,
478
- True,
479
- True,
480
- True,
481
- "G4-32",
482
- None,
483
- None,
484
- None,
485
- None,
486
- None,
487
- [],
488
- [],
489
- ),
490
- (
491
- UUID("e595d082-ed7c-4000-b2ca-e84176be21bf"),
492
- "空手部",
493
- "からてぶ",
494
- "演武",
495
- None,
496
- True,
497
- False,
498
- False,
499
- "D1-13:30~14:00",
500
- None,
501
- None,
502
- None,
503
- None,
504
- None,
505
- [],
506
- [],
507
- ),
508
- (
509
- UUID("056e038e-647b-4280-82b7-01c7323d9138"),
510
- "空手部",
511
- "からてぶ",
512
- "出張!空手喫茶~白魂(しらたま)始めました~",
513
- None,
514
- True,
515
- True,
516
- True,
517
- "本-08",
518
- None,
519
- None,
520
- None,
521
- None,
522
- None,
523
- [],
524
- [],
525
- ),
526
- (
527
- UUID("ecfc20a0-7410-4000-b67e-10503a0879e8"),
528
- "軽音楽部",
529
- "けいおんがくぶ",
530
- "バンド演奏",
531
- None,
532
- True,
533
- True,
534
- True,
535
- "G4-43",
536
- None,
537
- None,
538
- None,
539
- None,
540
- None,
541
- [],
542
- [],
543
- ),
544
- (
545
- UUID("024e0dea-d907-4f20-8127-06f56c83e794"),
546
- "軽音楽部",
547
- "けいおんがくぶ",
548
- "RADWIMPS、10FEET、HERO COMPLEX",
549
- None,
550
- False,
551
- True,
552
- True,
553
- "D2 10:00~10:30, D3 9:30~10:30",
554
- None,
555
- None,
556
- None,
557
- None,
558
- None,
559
- [],
560
- [],
561
- ),
562
- (
563
- UUID("70ddc3ed-5db2-4c00-b86e-e1f6aed91ea9"),
564
- "劇団個人主義×劇団NONNY",
565
- "げきだんこじんしゅぎげきだんのにー",
566
- "短編演劇フェスティバル2025",
567
- None,
568
- True,
569
- True,
570
- True,
571
- "G5-22",
572
- None,
573
- None,
574
- None,
575
- None,
576
- None,
577
- [],
578
- [],
579
- ),
580
- (
581
- UUID("6c0396e7-17a8-4800-b601-cb738bd47b88"),
582
- "作曲サークルトニカ",
583
- "さっきょくさーくるとにか",
584
- "TONICA Music Lab",
585
- None,
586
- True,
587
- True,
588
- True,
589
- "G5-51",
590
- None,
591
- None,
592
- None,
593
- None,
594
- None,
595
- [],
596
- [],
597
- ),
598
- (
599
- UUID("c1a568fe-29a9-4000-a0d2-b47f14d4f964"),
600
- "作曲サークルトニカ",
601
- "さっきょくさーくるとにか",
602
- "DJパフォーマンス",
603
- None,
604
- True,
605
- True,
606
- False,
607
- "D1-15:30~16:00/D2-10:30~11:00",
608
- None,
609
- None,
610
- None,
611
- None,
612
- None,
613
- [],
614
- [],
615
- ),
616
- (
617
- UUID("f9f8a7cb-336f-4000-bcfc-53e599b78fbb"),
618
- "紫千会",
619
- "しせんかい",
620
- "邦楽演奏",
621
- None,
622
- True,
623
- True,
624
- False,
625
- "G5-41",
626
- None,
627
- None,
628
- None,
629
- None,
630
- None,
631
- [],
632
- [],
633
- ),
634
- (
635
- UUID("79b74bca-3e0a-4000-bcdb-a5e51f04ff98"),
636
- "紫千会",
637
- "しせんかい",
638
- "三曲パフェ",
639
- None,
640
- True,
641
- True,
642
- False,
643
- "教-08",
644
- None,
645
- None,
646
- None,
647
- None,
648
- None,
649
- [],
650
- [],
651
- ),
652
- (
653
- UUID("6d1131f7-686e-4400-b688-98fbb4377292"),
654
- "写真部",
655
- "しゃしんぶ",
656
- "一景",
657
- None,
658
- True,
659
- True,
660
- True,
661
- "演習室23",
662
- None,
663
- None,
664
- None,
665
- None,
666
- None,
667
- [],
668
- [],
669
- ),
670
- (
671
- UUID("4918864f-f5b5-4000-a48c-4327fadac01f"),
672
- "手話サークル\u3000ウルトラマンの会",
673
- "しゅわさーくるうるとらまんのかい",
674
- "手話で脱出!!桃太聾の鬼退治",
675
- None,
676
- True,
677
- True,
678
- True,
679
- "演習室24",
680
- None,
681
- None,
682
- None,
683
- None,
684
- None,
685
- [],
686
- [],
687
- ),
688
- (
689
- UUID("95bda841-7a70-4000-8ade-d420bd387907"),
690
- "書道サークルぼくじる",
691
- "しょどうさーくるぼくじる",
692
- "筆結び~ぼくじる書道展~",
693
- None,
694
- True,
695
- True,
696
- True,
697
- "G4-32",
698
- None,
699
- None,
700
- None,
701
- None,
702
- None,
703
- [],
704
- [],
705
- ),
706
- (
707
- UUID("db5fcef9-692f-4000-adaf-e77cb497b0c3"),
708
- "書道サークルぼくじる",
709
- "しょどうさーくるぼくじる",
710
- "書道パフォーマンス",
711
- None,
712
- True,
713
- True,
714
- True,
715
- "D1-12:00~12:20/D2-15:30~15:50/D3-10:30~10:50",
716
- None,
717
- None,
718
- None,
719
- None,
720
- None,
721
- [],
722
- [],
723
- ),
724
- (
725
- UUID("5ea6d098-64cd-4000-af53-684c3266b7cf"),
726
- "清水ゼミ",
727
- "しみずぜみ",
728
- "企業研究発表",
729
- None,
730
- False,
731
- False,
732
- False,
733
- "101講義室",
734
- None,
735
- None,
736
- None,
737
- None,
738
- None,
739
- [],
740
- [],
741
- ),
742
- (
743
- UUID("237f577f-e186-4400-91bf-abbff0c32990"),
744
- "OLIOLI",
745
- "おりおり",
746
- "折り紙作品展",
747
- None,
748
- True,
749
- True,
750
- True,
751
- "共通演習室4",
752
- None,
753
- None,
754
- None,
755
- None,
756
- None,
757
- [],
758
- [],
759
- ),
760
- (
761
- UUID("1fdade91-c115-4700-8fed-6f48e08afbb9"),
762
- "鉄道研究会",
763
- "てつどうけんきゅうかい",
764
- "西千葉人車鉄道",
765
- None,
766
- True,
767
- True,
768
- True,
769
- "未設定",
770
- None,
771
- None,
772
- None,
773
- None,
774
- None,
775
- [],
776
- [],
777
- ),
778
- (
779
- UUID("f7b98fd7-8fb8-4800-bbdc-c7ebc7dc0c60"),
780
- "鉄道研究会",
781
- "てつどうけんきゅうかい",
782
- "鉄道模型・写真展示",
783
- None,
784
- True,
785
- True,
786
- True,
787
- "G5-52",
788
- None,
789
- None,
790
- None,
791
- None,
792
- None,
793
- [],
794
- [],
795
- ),
796
- (
797
- UUID("bd005876-875c-4800-9e80-2c3b43ae24d7"),
798
- "電子計算機研究会",
799
- "でんしけいさんきけんきゅうかい",
800
- "CCSゲームショウ2025",
801
- None,
802
- True,
803
- True,
804
- True,
805
- "共通演習室1",
806
- None,
807
- None,
808
- None,
809
- None,
810
- None,
811
- [],
812
- [],
813
- ),
814
- (
815
- UUID("4f100f4c-18b2-4800-a788-07a60c592b10"),
816
- "謎解きサークル rpurb",
817
- "なぞときさーくるるぱーぶ",
818
- "謎解きゲームCARDS",
819
- None,
820
- False,
821
- False,
822
- False,
823
- "G4-22",
824
- None,
825
- None,
826
- None,
827
- None,
828
- None,
829
- [],
830
- [],
831
- ),
832
- (
833
- UUID("4d504f80-4ec3-4c00-a6a8-27c02761eeff"),
834
- "麦",
835
- "むぎ",
836
- "本格喫茶",
837
- None,
838
- True,
839
- True,
840
- True,
841
- "文-03",
842
- None,
843
- None,
844
- None,
845
- None,
846
- None,
847
- [],
848
- [],
849
- ),
850
- (
851
- UUID("c6efad33-6e4e-4800-a377-d699b72745a9"),
852
- "美術サークル",
853
- "びじゅつさーくる",
854
- "作品展示",
855
- None,
856
- True,
857
- True,
858
- True,
859
- "共通演習室1",
860
- None,
861
- None,
862
- None,
863
- None,
864
- None,
865
- [],
866
- [],
867
- ),
868
- (
869
- UUID("95537b9b-c9e0-4800-8aa9-bdcde4f07d67"),
870
- "仏教哲学研究会",
871
- "ぶっきょうてつがくけんきゅうかい",
872
- "平和について、考えてみた。展-広島旅や対話を通してみえた記録-",
873
- None,
874
- True,
875
- True,
876
- True,
877
- "101講義室",
878
- None,
879
- None,
880
- None,
881
- None,
882
- None,
883
- [],
884
- [],
885
- ),
886
- (
887
- UUID("4eb7d46e-a436-4000-a75b-ea37521b0005"),
888
- "文藝部",
889
- "ぶんげいぶ",
890
- "部誌売り歩き",
891
- None,
892
- True,
893
- True,
894
- True,
895
- "未設定",
896
- None,
897
- None,
898
- None,
899
- None,
900
- None,
901
- [],
902
- [],
903
- ),
904
- (
905
- UUID("bd59ea7f-d3c2-4800-9eac-f53fe9e12530"),
906
- "文藝部",
907
- "ぶんげいぶ",
908
- "千葉大学文藝部",
909
- None,
910
- True,
911
- True,
912
- True,
913
- "共通演習室2",
914
- None,
915
- None,
916
- None,
917
- None,
918
- None,
919
- [],
920
- [],
921
- ),
922
- (
923
- UUID("bd216109-7fc3-4800-9e90-b084bfe19233"),
924
- "放送研究会",
925
- "ほうそうけんきゅうかい",
926
- "千葉大学放送研究会-千葉大祭番組発表会",
927
- None,
928
- True,
929
- True,
930
- True,
931
- "G5-32",
932
- None,
933
- None,
934
- None,
935
- None,
936
- None,
937
- [],
938
- [],
939
- ),
940
- (
941
- UUID("1278638a-9029-4c00-893c-31c54814edd3"),
942
- "漫画研究会",
943
- "まんがけんきゅうかい",
944
- "漫画研究会",
945
- None,
946
- True,
947
- True,
948
- True,
949
- "G4-31",
950
- None,
951
- None,
952
- None,
953
- None,
954
- None,
955
- [],
956
- [],
957
- ),
958
- (
959
- UUID("8198b7ae-6c5d-4000-80cc-5bd7362ef16b"),
960
- "模型同好会",
961
- "もけいどうこうかい",
962
- "模型展示会",
963
- None,
964
- True,
965
- True,
966
- True,
967
- "演習室21",
968
- None,
969
- None,
970
- None,
971
- None,
972
- None,
973
- [],
974
- [],
975
- ),
976
- (
977
- UUID("898dcb73-6b99-4800-84c6-e5b9b5ccec0b"),
978
- "葉法会",
979
- "ようほうかい",
980
- "テント企画",
981
- None,
982
- True,
983
- True,
984
- True,
985
- "工北-10",
986
- None,
987
- None,
988
- None,
989
- None,
990
- None,
991
- [],
992
- [],
993
- ),
994
- (
995
- UUID("6756e027-3757-4c00-b3ab-70139babf503"),
996
- "落語研究会",
997
- "らくごけんきゅうかい",
998
- "大学祭特別興行",
999
- None,
1000
- True,
1001
- True,
1002
- True,
1003
- "G4-53",
1004
- None,
1005
- None,
1006
- None,
1007
- None,
1008
- None,
1009
- [],
1010
- [],
1011
- ),
1012
- (
1013
- UUID("a02f19d8-d9eb-4800-9017-8cec6cf5da97"),
1014
- "歴史研究会",
1015
- "れきしけんきゅうかい",
1016
- "会誌販売",
1017
- None,
1018
- True,
1019
- True,
1020
- True,
1021
- "共通演習室2",
1022
- None,
1023
- None,
1024
- None,
1025
- None,
1026
- None,
1027
- [],
1028
- [],
1029
- ),
1030
- (
1031
- UUID("3c158a51-db5e-4000-9e0a-c528edaf178f"),
1032
- "B.A.S.S.",
1033
- "ばす",
1034
- "クレープ屋!",
1035
- None,
1036
- True,
1037
- True,
1038
- True,
1039
- "工南-08",
1040
- None,
1041
- None,
1042
- None,
1043
- None,
1044
- None,
1045
- [],
1046
- [],
1047
- ),
1048
- (
1049
- UUID("de3f873e-b610-4800-af1f-c39f5b083b43"),
1050
- "CATS",
1051
- "きゃっつ",
1052
- "萌ワッフル",
1053
- None,
1054
- True,
1055
- True,
1056
- True,
1057
- "工南-05",
1058
- None,
1059
- None,
1060
- None,
1061
- None,
1062
- None,
1063
- [],
1064
- [],
1065
- ),
1066
- (
1067
- UUID("567d65cf-f94a-4400-ab3e-b2e7fca56926"),
1068
- "C.D.C千葉大学ディズニーサークル",
1069
- "しーでぃーしーちばだいがくでぃずにーさーくる",
1070
- "スウィーツフルタイム?",
1071
- None,
1072
- True,
1073
- True,
1074
- True,
1075
- "工南-12",
1076
- None,
1077
- None,
1078
- None,
1079
- None,
1080
- None,
1081
- [],
1082
- [],
1083
- ),
1084
- (
1085
- UUID("05768780-fd88-4580-82bb-43c07ec432c7"),
1086
- "CHANGE!!",
1087
- "ちぇんじ",
1088
- "あなたの味覚に強烈スパイク!!CHANGE!!のロシアンたこ焼き",
1089
- None,
1090
- True,
1091
- True,
1092
- False,
1093
- "教-15",
1094
- None,
1095
- None,
1096
- None,
1097
- None,
1098
- None,
1099
- [],
1100
- [],
1101
- ),
1102
- (
1103
- UUID("b337d66e-caf8-4000-999b-eb37657c382c"),
1104
- "CHIよREN北天魁",
1105
- "ちよれんほくてんかい",
1106
- "飲み物はいかが?",
1107
- None,
1108
- True,
1109
- True,
1110
- True,
1111
- "未設定",
1112
- None,
1113
- None,
1114
- None,
1115
- None,
1116
- None,
1117
- [],
1118
- [],
1119
- ),
1120
- (
1121
- UUID("aa4d50d6-5ea8-4800-9526-a86b2f5425c3"),
1122
- "CHIよREN北天魁",
1123
- "ちよれんほくてんかい",
1124
- "たこもつ本舗",
1125
- None,
1126
- True,
1127
- True,
1128
- True,
1129
- "工北-15",
1130
- None,
1131
- None,
1132
- None,
1133
- None,
1134
- None,
1135
- [],
1136
- [],
1137
- ),
1138
- (
1139
- UUID("b4102f29-8ba2-4000-9a08-1794c5d121cf"),
1140
- "CISG",
1141
- "しーあいえすじー",
1142
- "わらび餅の販売",
1143
- None,
1144
- True,
1145
- True,
1146
- True,
1147
- "文-02",
1148
- None,
1149
- None,
1150
- None,
1151
- None,
1152
- None,
1153
- [],
1154
- [],
1155
- ),
1156
- (
1157
- UUID("18d50d94-1458-4500-8c6a-86ca0a2c02bc"),
1158
- "Fabric",
1159
- "ふぁぶりっく",
1160
- "らくがきせんべい",
1161
- None,
1162
- False,
1163
- True,
1164
- True,
1165
- "理-07",
1166
- None,
1167
- None,
1168
- None,
1169
- None,
1170
- None,
1171
- [],
1172
- [],
1173
- ),
1174
- (
1175
- UUID("46c8fb6b-0b60-4c00-a364-7db585b03e81"),
1176
- "FC RIFLIE",
1177
- "えふしーれふりえ",
1178
- "レフリエフランクフルト",
1179
- None,
1180
- True,
1181
- True,
1182
- True,
1183
- "本-01",
1184
- None,
1185
- None,
1186
- None,
1187
- None,
1188
- None,
1189
- [],
1190
- [],
1191
- ),
1192
- (
1193
- UUID("a90edd07-7ddf-4800-9487-6e83beefb460"),
1194
- "バスケットボールサークルJAM",
1195
- "ばすけっとぼーるさーくるじゃむ",
1196
- "らくがきせんべい",
1197
- None,
1198
- True,
1199
- True,
1200
- True,
1201
- "教-01",
1202
- None,
1203
- None,
1204
- None,
1205
- None,
1206
- None,
1207
- [],
1208
- [],
1209
- ),
1210
- (
1211
- UUID("a3f13436-8049-4000-91f8-9a1b40248647"),
1212
- "KIDS CLUB",
1213
- "きっずくらぶ",
1214
- "フルーツ飴",
1215
- None,
1216
- True,
1217
- True,
1218
- True,
1219
- "理-13",
1220
- None,
1221
- None,
1222
- None,
1223
- None,
1224
- None,
1225
- [],
1226
- [],
1227
- ),
1228
- (
1229
- UUID("f976532b-74e9-4000-bcbb-2995ba74e9d5"),
1230
- "LASバーガー",
1231
- "らすばーがー",
1232
- "テント企画",
1233
- None,
1234
- True,
1235
- True,
1236
- True,
1237
- "工北-16",
1238
- None,
1239
- None,
1240
- None,
1241
- None,
1242
- None,
1243
- [],
1244
- [],
1245
- ),
1246
- (
1247
- UUID("3b6cc62e-7e60-4600-9db6-63173f3052f1"),
1248
- "Maybegood",
1249
- "めいびーぐっど",
1250
- "やきとり",
1251
- None,
1252
- True,
1253
- True,
1254
- True,
1255
- "工北-07",
1256
- None,
1257
- None,
1258
- None,
1259
- None,
1260
- None,
1261
- [],
1262
- [],
1263
- ),
1264
- (
1265
- UUID("43b84d2f-3a04-4400-a1dc-26979d021a2b"),
1266
- "折田研究室",
1267
- "おりたけんきゅうしつ",
1268
- "ホットドッグ・フランクフルト",
1269
- None,
1270
- True,
1271
- True,
1272
- True,
1273
- "工北-06",
1274
- None,
1275
- None,
1276
- None,
1277
- None,
1278
- None,
1279
- [],
1280
- [],
1281
- ),
1282
- (
1283
- UUID("f645d841-0f7e-4800-bb22-ec2087bf4340"),
1284
- "OSF 国際学生会館",
1285
- "おえせふこくさいがくせいかいかん",
1286
- "OSFコーナ",
1287
- None,
1288
- False,
1289
- False,
1290
- True,
1291
- "留-02",
1292
- None,
1293
- None,
1294
- None,
1295
- None,
1296
- None,
1297
- [],
1298
- [],
1299
- ),
1300
- (
1301
- UUID("3110f8bf-5899-4400-9888-7c5fac4c818d"),
1302
- "WOOD STOCK",
1303
- "うっどすとっく",
1304
- "ゲレンデでとろけるチーズボール",
1305
- None,
1306
- True,
1307
- True,
1308
- True,
1309
- "工北-03",
1310
- None,
1311
- None,
1312
- None,
1313
- None,
1314
- None,
1315
- [],
1316
- [],
1317
- ),
1318
- (
1319
- UUID("04e7d0c9-4ce2-4dc0-8273-e864a6716ee3"),
1320
- "アカペラサークルT.o.N.E.",
1321
- "あかぺらさーくるとーん",
1322
- "アカペラライブ",
1323
- None,
1324
- True,
1325
- True,
1326
- True,
1327
- "未設定",
1328
- None,
1329
- None,
1330
- None,
1331
- None,
1332
- None,
1333
- [],
1334
- [],
1335
- ),
1336
- (
1337
- UUID("6a60d60f-e6e9-4c00-b530-6b07f374ddf3"),
1338
- "アカペラサークルT.o.N.E.",
1339
- "あかぺらさーくるとーん",
1340
- "アカペラサークルT.o.N.E.",
1341
- None,
1342
- False,
1343
- False,
1344
- False,
1345
- "工北-18",
1346
- None,
1347
- None,
1348
- None,
1349
- None,
1350
- None,
1351
- [],
1352
- [],
1353
- ),
1354
- (
1355
- UUID("47db4898-6bd2-4800-a3ed-a44c35e94b8b"),
1356
- "アカペラサークルT.o.N.E.",
1357
- "あかぺらさーくるとーん",
1358
- "ステージ企画",
1359
- None,
1360
- True,
1361
- False,
1362
- False,
1363
- "D1 12:25~13:25",
1364
- None,
1365
- None,
1366
- None,
1367
- None,
1368
- None,
1369
- [],
1370
- [],
1371
- ),
1372
- (
1373
- UUID("58834229-02fe-4000-ac41-a114817f0737"),
1374
- "アカペラサークルT.o.N.E.",
1375
- "あかぺらさーくるとーん",
1376
- "アカペラライブ",
1377
- None,
1378
- True,
1379
- True,
1380
- True,
1381
- "D1-10:00~11:00&16:30~17:00/D2-9:00~9:30&13:30~14:00&16:00~16:30/D3-9:30~10:00&12:50~13:20",
1382
- None,
1383
- None,
1384
- None,
1385
- None,
1386
- None,
1387
- [],
1388
- [],
1389
- ),
1390
- (
1391
- UUID("5ee7551b-fdda-4000-af73-aa8dfeed3f27"),
1392
- "アカペラサークルT.o.N.E.",
1393
- "あかぺらさーくるとーん",
1394
- "中夜祭",
1395
- None,
1396
- True,
1397
- False,
1398
- False,
1399
- "未設定",
1400
- None,
1401
- None,
1402
- None,
1403
- None,
1404
- None,
1405
- [],
1406
- [],
1407
- ),
1408
- (
1409
- UUID("70866602-5723-4800-b843-33012b91bcb0"),
1410
- "あまりぃず",
1411
- "あまりぃず",
1412
- "あまりぃずのだんご",
1413
- None,
1414
- True,
1415
- True,
1416
- True,
1417
- "工南-01",
1418
- None,
1419
- None,
1420
- None,
1421
- None,
1422
- None,
1423
- [],
1424
- [],
1425
- ),
1426
- (
1427
- UUID("8e3ce16f-e3eb-4800-871e-70b7f1f59bdc"),
1428
- "エレクトーンサークルえれちば",
1429
- "えれくとーんさーくるえれちば",
1430
- "えれちばステージ発表",
1431
- None,
1432
- True,
1433
- False,
1434
- False,
1435
- "D1 16:00~17:00",
1436
- None,
1437
- None,
1438
- None,
1439
- None,
1440
- None,
1441
- [],
1442
- [],
1443
- ),
1444
- (
1445
- UUID("c1484de5-5a21-4800-a0a4-26f2ad10a2fa"),
1446
- "エレクトーンサークルえれちば",
1447
- "えれくとーんさーくるえれちば",
1448
- "えれちばチョコバナナ",
1449
- None,
1450
- True,
1451
- True,
1452
- True,
1453
- "本-06",
1454
- None,
1455
- None,
1456
- None,
1457
- None,
1458
- None,
1459
- [],
1460
- [],
1461
- ),
1462
- (
1463
- UUID("fc36f2d4-f920-4000-be1b-796a7c906f65"),
1464
- "オリエンテーリング部",
1465
- "おりえんてーりんぐぶ",
1466
- "たこ焼き販売",
1467
- None,
1468
- True,
1469
- True,
1470
- True,
1471
- "本-04",
1472
- None,
1473
- None,
1474
- None,
1475
- None,
1476
- None,
1477
- [],
1478
- [],
1479
- ),
1480
- (
1481
- UUID("564782c8-9ca2-4400-ab23-c1644e510af6"),
1482
- "ギタークラブ",
1483
- "ぎ���ーくらぶ",
1484
- "ギタークラブ",
1485
- None,
1486
- False,
1487
- False,
1488
- False,
1489
- "教-14",
1490
- None,
1491
- None,
1492
- None,
1493
- None,
1494
- None,
1495
- [],
1496
- [],
1497
- ),
1498
- (
1499
- UUID("daacf1ab-54c6-4000-ad56-78d5aa632f58"),
1500
- "くたびれもうけ",
1501
- "くたびれもうけ",
1502
- "飲食販売(チーズハットグ、あげパン、ティラミス)",
1503
- None,
1504
- True,
1505
- True,
1506
- True,
1507
- "工南-06",
1508
- None,
1509
- None,
1510
- None,
1511
- None,
1512
- None,
1513
- [],
1514
- [],
1515
- ),
1516
- (
1517
- UUID("fe74a82e-c86b-4000-bf3a-541764358fd6"),
1518
- "ゴルフ部",
1519
- "ごるふぶ",
1520
- "じゃがパター",
1521
- None,
1522
- False,
1523
- False,
1524
- False,
1525
- "工北-08",
1526
- None,
1527
- None,
1528
- None,
1529
- None,
1530
- None,
1531
- [],
1532
- [],
1533
- ),
1534
- (
1535
- UUID("16bd94aa-c45c-4100-8b5e-ca55622e30b1"),
1536
- "サッカー同好会",
1537
- "さっかーどうこうかい",
1538
- "架電済み",
1539
- None,
1540
- True,
1541
- True,
1542
- True,
1543
- "文-01",
1544
- None,
1545
- None,
1546
- None,
1547
- None,
1548
- None,
1549
- [],
1550
- [],
1551
- ),
1552
- (
1553
- UUID("488e58b8-996c-4c00-a447-2c5c4cb65d90"),
1554
- "サバイバルゲーム研究会",
1555
- "さばいばるげーむけんきゅうかい",
1556
- "装備展示-射撃体験",
1557
- None,
1558
- True,
1559
- True,
1560
- True,
1561
- "G4-52",
1562
- None,
1563
- None,
1564
- None,
1565
- None,
1566
- None,
1567
- [],
1568
- [],
1569
- ),
1570
- (
1571
- UUID("60c847e1-4d5b-4c00-b064-23f0a6adb691"),
1572
- "サバイバルゲーム研究会",
1573
- "さばいばるげーむけんきゅうかい",
1574
- "ナーフ射的",
1575
- None,
1576
- True,
1577
- True,
1578
- True,
1579
- "理-04",
1580
- None,
1581
- None,
1582
- None,
1583
- None,
1584
- None,
1585
- [],
1586
- [],
1587
- ),
1588
- (
1589
- UUID("7588dc0c-c8ec-4000-bac4-6e0664765723"),
1590
- "スイーツ研究会ショコラ",
1591
- "すいーつけんきゅうかいしょこら",
1592
- "ぷるっとモチモチわらび餅ドリンク",
1593
- None,
1594
- True,
1595
- True,
1596
- True,
1597
- "理-10",
1598
- None,
1599
- None,
1600
- None,
1601
- None,
1602
- None,
1603
- [],
1604
- [],
1605
- ),
1606
- (
1607
- UUID("7fc88b37-ec85-4400-bfe4-459bf642b23a"),
1608
- "スキー部",
1609
- "すきーぶ",
1610
- "パイアイス",
1611
- None,
1612
- True,
1613
- True,
1614
- True,
1615
- "本-09",
1616
- None,
1617
- None,
1618
- None,
1619
- None,
1620
- None,
1621
- [],
1622
- [],
1623
- ),
1624
- (
1625
- UUID("0ff28fae-fcb5-4400-87f9-47d77e5ac9e5"),
1626
- "YELL",
1627
- "えーる",
1628
- "ギョウザドッグ",
1629
- None,
1630
- True,
1631
- True,
1632
- True,
1633
- "工北-01",
1634
- None,
1635
- None,
1636
- None,
1637
- None,
1638
- None,
1639
- [],
1640
- [],
1641
- ),
1642
- (
1643
- UUID("602aa843-ccd2-4c00-b015-5421e6694e6f"),
1644
- "ちばねこ",
1645
- "ちばねこ",
1646
- "大祭をネコで染めてやる。25年秋、魂の物販!!",
1647
- None,
1648
- True,
1649
- True,
1650
- True,
1651
- "工南-18",
1652
- None,
1653
- None,
1654
- None,
1655
- None,
1656
- None,
1657
- [],
1658
- [],
1659
- ),
1660
- (
1661
- UUID("0c531e95-c275-4f00-8629-8f4ae13af760"),
1662
- "VERDE",
1663
- "べるで",
1664
- "はい、チーズ!君とチュロスのツーショット",
1665
- None,
1666
- True,
1667
- True,
1668
- True,
1669
- "工南-14",
1670
- None,
1671
- None,
1672
- None,
1673
- None,
1674
- None,
1675
- [],
1676
- [],
1677
- ),
1678
- (
1679
- UUID("54aee037-90ac-4000-aa57-701bc856372f"),
1680
- "バドミントン部",
1681
- "ばどみんとんぶ",
1682
- "バドミントン部のお好み焼き~お好みのテンションはいくつですか?~",
1683
- None,
1684
- True,
1685
- True,
1686
- True,
1687
- "教-04",
1688
- None,
1689
- None,
1690
- None,
1691
- None,
1692
- None,
1693
- [],
1694
- [],
1695
- ),
1696
- (
1697
- UUID("62e5a2b8-8901-4000-b172-d15c4480a0a0"),
1698
- "フットサル部",
1699
- "ふっとさるぶ",
1700
- "学祭で団子食えるの俺たちの「おかげやん」",
1701
- None,
1702
- True,
1703
- True,
1704
- True,
1705
- "理-17",
1706
- None,
1707
- None,
1708
- None,
1709
- None,
1710
- None,
1711
- [],
1712
- [],
1713
- ),
1714
- (
1715
- UUID("a1de732c-39c4-4000-90ef-39961ce23983"),
1716
- "フロアボールクラブ",
1717
- "ふろあぼーるくらぶ",
1718
- "フロアボールクラブ",
1719
- None,
1720
- False,
1721
- False,
1722
- False,
1723
- "理-15",
1724
- None,
1725
- None,
1726
- None,
1727
- None,
1728
- None,
1729
- [],
1730
- [],
1731
- ),
1732
- (
1733
- UUID("3d1db7d8-49f9-4200-9e8e-dbec24fca163"),
1734
- "ライフル射撃部",
1735
- "らいふるしゃげきぶ",
1736
- "射撃部の射的",
1737
- None,
1738
- True,
1739
- True,
1740
- True,
1741
- "工北-11",
1742
- None,
1743
- None,
1744
- None,
1745
- None,
1746
- None,
1747
- [],
1748
- [],
1749
- ),
1750
- (
1751
- UUID("9ee1712d-d28b-4800-8f70-b896e94594eb"),
1752
- "ワンダーフォーゲル部",
1753
- "わんだーふぉーげるぶ",
1754
- "ベビーカステラ",
1755
- None,
1756
- True,
1757
- True,
1758
- True,
1759
- "理-08",
1760
- None,
1761
- None,
1762
- None,
1763
- None,
1764
- None,
1765
- [],
1766
- [],
1767
- ),
1768
- (
1769
- UUID("18833060-98f2-4400-8c41-98304c7919cd"),
1770
- "亥鼻陸上部",
1771
- "いのはなりくじょうぶ",
1772
- "しろくまとブリュレアイス",
1773
- None,
1774
- True,
1775
- True,
1776
- True,
1777
- "工南-10",
1778
- None,
1779
- None,
1780
- None,
1781
- None,
1782
- None,
1783
- [],
1784
- [],
1785
- ),
1786
- (
1787
- UUID("c3a515bc-b609-4800-a1d2-8ade5b04da0c"),
1788
- "英語教育コース",
1789
- "えいごきょういくこーす",
1790
- "ホーンまにおいしい香り雄隆なさつまいもブリュレ",
1791
- None,
1792
- True,
1793
- True,
1794
- True,
1795
- "工南-02",
1796
- None,
1797
- None,
1798
- None,
1799
- None,
1800
- None,
1801
- [],
1802
- [],
1803
- ),
1804
- (
1805
- UUID("97a65ae7-6aab-4000-8bd3-2d73b555c749"),
1806
- "化学科",
1807
- "かがくか",
1808
- "化学式チュロス",
1809
- None,
1810
- True,
1811
- True,
1812
- True,
1813
- "理-06",
1814
- None,
1815
- None,
1816
- None,
1817
- None,
1818
- None,
1819
- [],
1820
- [],
1821
- ),
1822
- (
1823
- UUID("51a7058b-8a40-4c00-a8d3-82c5c5204538"),
1824
- "環境ISO学生委員会",
1825
- "かんきょうあいえすおーがくせいいいんかい",
1826
- "飲めるうどん",
1827
- None,
1828
- True,
1829
- True,
1830
- True,
1831
- "理-09",
1832
- None,
1833
- None,
1834
- None,
1835
- None,
1836
- None,
1837
- [],
1838
- [],
1839
- ),
1840
- (
1841
- UUID("ff890629-d2a5-4800-bfc4-8314e952bcdd"),
1842
- "韓国人留学生会",
1843
- "かんこくじんりゅうがくせいかい",
1844
- "The last leaf",
1845
- None,
1846
- False,
1847
- False,
1848
- True,
1849
- "D3 11:00~11:30",
1850
- None,
1851
- None,
1852
- None,
1853
- None,
1854
- None,
1855
- [],
1856
- [],
1857
- ),
1858
- (
1859
- UUID("dbab8c2b-4fc4-4800-add5-c615a7e21a33"),
1860
- "韓国人留学生会",
1861
- "かんこくじんりゅうがくせいかい",
1862
- "韓国の味",
1863
- None,
1864
- True,
1865
- True,
1866
- True,
1867
- "留-05",
1868
- None,
1869
- None,
1870
- None,
1871
- None,
1872
- None,
1873
- [],
1874
- [],
1875
- ),
1876
- (
1877
- UUID("40a15f29-0e12-4c00-a050-af9487097e69"),
1878
- "教育学部数学科",
1879
- "きょういくがくぶすうがくか",
1880
- "成年の主張",
1881
- None,
1882
- True,
1883
- False,
1884
- False,
1885
- "未設定",
1886
- None,
1887
- None,
1888
- None,
1889
- None,
1890
- None,
1891
- [],
1892
- [],
1893
- ),
1894
- (
1895
- UUID("af037661-94c9-4800-9781-bb30ca64a2e7"),
1896
- "教育学部数学科",
1897
- "きょういくがくぶすうがくか",
1898
- "トルネードポテト",
1899
- "FOOD",
1900
- True,
1901
- True,
1902
- True,
1903
- "工北-02",
1904
- None,
1905
- None,
1906
- None,
1907
- None,
1908
- None,
1909
- [],
1910
- [],
1911
- ),
1912
- (
1913
- UUID("a27c5dcf-5ecc-4000-913e-2ee7af6631ac"),
1914
- "剣道サークル志剣",
1915
- "けんどうさーくるしけん",
1916
- "もつ煮",
1917
- None,
1918
- False,
1919
- True,
1920
- True,
1921
- "工北-13",
1922
- None,
1923
- None,
1924
- None,
1925
- None,
1926
- None,
1927
- [],
1928
- [],
1929
- ),
1930
- (
1931
- UUID("1a9ca244-d94b-4100-8d4e-51226ca5f073"),
1932
- "剣道部",
1933
- "けんどうぶ",
1934
- "たぴ道剣吉",
1935
- None,
1936
- True,
1937
- True,
1938
- True,
1939
- "教-06",
1940
- None,
1941
- None,
1942
- None,
1943
- None,
1944
- None,
1945
- [],
1946
- [],
1947
- ),
1948
- (
1949
- UUID("24579a95-8a8b-4800-922b-cd4ac545b3e9"),
1950
- "硬式テニス部",
1951
- "こうしきてにすぶ",
1952
- "揚げパンサンド",
1953
- None,
1954
- True,
1955
- True,
1956
- True,
1957
- "工南-19",
1958
- None,
1959
- None,
1960
- None,
1961
- None,
1962
- None,
1963
- [],
1964
- [],
1965
- ),
1966
- (
1967
- UUID("c63c0bb0-e0e8-4800-a31e-05d870747cd9"),
1968
- "硬式野球部",
1969
- "こうしきやきゅうぶ",
1970
- "焼きゅう鳥",
1971
- None,
1972
- True,
1973
- True,
1974
- True,
1975
- "教-05",
1976
- None,
1977
- None,
1978
- None,
1979
- None,
1980
- None,
1981
- [],
1982
- [],
1983
- ),
1984
- (
1985
- UUID("1359c64f-5423-4000-89ac-e327aa11afdd"),
1986
- "合気会合気道部",
1987
- "あいきかいあいきどうぶ",
1988
- "演武",
1989
- None,
1990
- False,
1991
- True,
1992
- False,
1993
- "D2-14:40~15:00",
1994
- None,
1995
- None,
1996
- None,
1997
- None,
1998
- None,
1999
- [],
2000
- [],
2001
- ),
2002
- (
2003
- UUID("c3a6083b-89cd-4800-a1d3-041dc4e6dc04"),
2004
- "合気会合気道部",
2005
- "あいきかいあいきどうぶ",
2006
- "カラカラからあげ",
2007
- None,
2008
- True,
2009
- True,
2010
- True,
2011
- "工北-14",
2012
- None,
2013
- None,
2014
- None,
2015
- None,
2016
- None,
2017
- [],
2018
- [],
2019
- ),
2020
- (
2021
- UUID("10075418-6ee3-4600-8803-aa0c37719333"),
2022
- "合唱団",
2023
- "がっしょうだん",
2024
- "合唱団ミニコンサート",
2025
- None,
2026
- True,
2027
- False,
2028
- False,
2029
- "未設定",
2030
- None,
2031
- None,
2032
- None,
2033
- None,
2034
- None,
2035
- [],
2036
- [],
2037
- ),
2038
- (
2039
- UUID("ab9f2cf6-8347-4000-95cf-967b41a37e48"),
2040
- "合唱団",
2041
- "がっしょうだん",
2042
- "ソラシトッポギ♪",
2043
- None,
2044
- True,
2045
- True,
2046
- True,
2047
- "理-03",
2048
- None,
2049
- None,
2050
- None,
2051
- None,
2052
- None,
2053
- [],
2054
- [],
2055
- ),
2056
- (
2057
- UUID("3353a8eb-43d7-4000-99a9-d475a1ebd042"),
2058
- "合唱団",
2059
- "がっしょうだん",
2060
- "合唱団ミニコンサート",
2061
- None,
2062
- False,
2063
- False,
2064
- True,
2065
- "D3 11:30~12:00",
2066
- None,
2067
- None,
2068
- None,
2069
- None,
2070
- None,
2071
- [],
2072
- [],
2073
- ),
2074
- (
2075
- UUID("4c1a857b-9bc6-4800-a60d-42bdcde30394"),
2076
- "骨折り損のバレーボール同好会",
2077
- "ほねおりぞんのばれーぼーるどうこうかい",
2078
- "豚キムチうどん、肉うどん",
2079
- None,
2080
- True,
2081
- True,
2082
- True,
2083
- "工北-20",
2084
- None,
2085
- None,
2086
- None,
2087
- None,
2088
- None,
2089
- [],
2090
- [],
2091
- ),
2092
- (
2093
- UUID("60056d58-d4c9-4800-b002-b6ac6a64cbea"),
2094
- "柔道部",
2095
- "じゅうどうぶ",
2096
- "汁粉とチ筋",
2097
- None,
2098
- True,
2099
- True,
2100
- True,
2101
- "工南-16",
2102
- None,
2103
- None,
2104
- None,
2105
- None,
2106
- None,
2107
- [],
2108
- [],
2109
- ),
2110
- (
2111
- UUID("ec52c50f-02e1-4000-b629-62878170997a"),
2112
- "準硬式野球部",
2113
- "じゅんこうしきやきゅうぶ",
2114
- "ママの飯屋",
2115
- None,
2116
- True,
2117
- True,
2118
- True,
2119
- "教-09",
2120
- None,
2121
- None,
2122
- None,
2123
- None,
2124
- None,
2125
- [],
2126
- [],
2127
- ),
2128
- (
2129
- UUID("3f4b8c1d-77b8-4800-9fa5-c60ebbdc2c02"),
2130
- "女子ソフトボール部",
2131
- "じょしそふとぼーるぶ",
2132
- "未設定",
2133
- None,
2134
- True,
2135
- True,
2136
- True,
2137
- "教-11",
2138
- None,
2139
- None,
2140
- None,
2141
- None,
2142
- None,
2143
- [],
2144
- [],
2145
- ),
2146
- (
2147
- UUID("c26bf7a3-d3d7-4000-a135-fbd1e9ebc8f5"),
2148
- "女子バスケットボール部",
2149
- "じょしばすけっとぼーるぶ",
2150
- "焦がし、恋しい、焼き芋ブリュレ",
2151
- None,
2152
- False,
2153
- False,
2154
- False,
2155
- "教-10",
2156
- None,
2157
- None,
2158
- None,
2159
- None,
2160
- None,
2161
- [],
2162
- [],
2163
- ),
2164
- (
2165
- UUID("b1e511b4-549d-4800-98f2-88da2a4ed5de"),
2166
- "女子ラクロス部",
2167
- "じょしらくろすぶ",
2168
- "未設定",
2169
- None,
2170
- True,
2171
- True,
2172
- False,
2173
- "教-17",
2174
- None,
2175
- None,
2176
- None,
2177
- None,
2178
- None,
2179
- [],
2180
- [],
2181
- ),
2182
- (
2183
- UUID("69071213-cca8-4800-b483-8909e6543b6e"),
2184
- "将棋部",
2185
- "しょうぎぶ",
2186
- "ツミナシツミアリ",
2187
- None,
2188
- True,
2189
- True,
2190
- True,
2191
- "院演習室1",
2192
- None,
2193
- None,
2194
- None,
2195
- None,
2196
- None,
2197
- [],
2198
- [],
2199
- ),
2200
- (
2201
- UUID("dbd5a6b1-495a-4000-adea-d358a4ad3f80"),
2202
- "少林寺拳法部",
2203
- "しょうりんじけんぽうぶ",
2204
- "演武",
2205
- None,
2206
- False,
2207
- True,
2208
- False,
2209
- "D2-15:00~15:30",
2210
- None,
2211
- None,
2212
- None,
2213
- None,
2214
- None,
2215
- [],
2216
- [],
2217
- ),
2218
- (
2219
- UUID("1ecdbffc-f46e-4800-8f66-dffe7a37442d"),
2220
- "少林寺拳法部",
2221
- "しょうりんじけんぽうぶ",
2222
- "オムそば",
2223
- None,
2224
- True,
2225
- False,
2226
- True,
2227
- "工南-09",
2228
- None,
2229
- None,
2230
- None,
2231
- None,
2232
- None,
2233
- [],
2234
- [],
2235
- ),
2236
- (
2237
- UUID("64a0ae3d-08fb-4800-b250-571e847da48d"),
2238
- "障害者問題研究会「おにっこ」",
2239
- "しょうがいしゃもんだいけんきゅうかいおにっこ",
2240
- "おでん",
2241
- None,
2242
- True,
2243
- True,
2244
- True,
2245
- "理-14",
2246
- None,
2247
- None,
2248
- None,
2249
- None,
2250
- None,
2251
- [],
2252
- [],
2253
- ),
2254
- (
2255
- UUID("b8ee96f3-7376-4800-9c77-4b79b9bb3a53"),
2256
- "吹奏楽団",
2257
- "すいそうがくだん",
2258
- "吹奏楽団ミニコンサート",
2259
- None,
2260
- True,
2261
- False,
2262
- False,
2263
- "未設定",
2264
- None,
2265
- None,
2266
- None,
2267
- None,
2268
- None,
2269
- [],
2270
- [],
2271
- ),
2272
- (
2273
- UUID("d2f66682-06c9-4000-a97b-33410364860b"),
2274
- "吹奏楽団",
2275
- "すいそうがくだん",
2276
- "あ!ろんぐなCUWOのフランクフルト",
2277
- None,
2278
- True,
2279
- True,
2280
- True,
2281
- "教-13",
2282
- None,
2283
- None,
2284
- None,
2285
- None,
2286
- None,
2287
- [],
2288
- [],
2289
- ),
2290
- (
2291
- UUID("6f9758b2-99a6-4000-b7cb-ac594cd3070d"),
2292
- "吹奏楽団",
2293
- "すいそうがくだん",
2294
- "吹奏楽団ミニコンサート",
2295
- None,
2296
- True,
2297
- True,
2298
- True,
2299
- "G5-10",
2300
- None,
2301
- None,
2302
- None,
2303
- None,
2304
- None,
2305
- [],
2306
- [],
2307
- ),
2308
- (
2309
- UUID("ee957f02-2e90-4000-b74a-bf8117482105"),
2310
- "推理小説同好会",
2311
- "すいりしょうせつどうこうかい",
2312
- "BOOK・COFF",
2313
- None,
2314
- True,
2315
- True,
2316
- True,
2317
- "理-16",
2318
- None,
2319
- None,
2320
- None,
2321
- None,
2322
- None,
2323
- [],
2324
- [],
2325
- ),
2326
- (
2327
- UUID("3ac48589-aabc-4600-9d62-42c4d55e1af3"),
2328
- "水泳部",
2329
- "すいえいぶ",
2330
- "アメリカンフラワーの販売",
2331
- None,
2332
- True,
2333
- True,
2334
- True,
2335
- "未設定",
2336
- None,
2337
- None,
2338
- None,
2339
- None,
2340
- None,
2341
- [],
2342
- [],
2343
- ),
2344
- (
2345
- UUID("fced3684-6d01-4000-be76-9b423680c8cf"),
2346
- "水泳部",
2347
- "すいえいぶ",
2348
- "揚げ春巻き、アメリカンフラワーの販売",
2349
- None,
2350
- True,
2351
- True,
2352
- True,
2353
- "工北-09",
2354
- None,
2355
- None,
2356
- None,
2357
- None,
2358
- None,
2359
- [],
2360
- [],
2361
- ),
2362
- (
2363
- UUID("6d8adbf2-a5b1-4400-b6c5-6df952d88215"),
2364
- "赤ジャンOBOG",
2365
- "あかじゃんおーびーおーじー",
2366
- "未設定",
2367
- None,
2368
- True,
2369
- True,
2370
- True,
2371
- "本-07",
2372
- None,
2373
- None,
2374
- None,
2375
- None,
2376
- None,
2377
- [],
2378
- [],
2379
- ),
2380
- (
2381
- UUID("e008f62d-552d-4000-b004-7b16aa96e766"),
2382
- "料理サークルbollon",
2383
- "りょうりさーくるぼろん",
2384
- "料理サークル特製“揚げ春巻き”2種(ベーコンピザ・のりチーズ)",
2385
- None,
2386
- True,
2387
- True,
2388
- False,
2389
- "工南-11",
2390
- None,
2391
- None,
2392
- None,
2393
- None,
2394
- None,
2395
- [],
2396
- [],
2397
- ),
2398
- (
2399
- UUID("c7b94e09-b217-4800-a3dc-a704d90bed30"),
2400
- "漕艇部",
2401
- "そうていぶ",
2402
- "牛串販売",
2403
- None,
2404
- True,
2405
- True,
2406
- True,
2407
- "工北-05",
2408
- None,
2409
- None,
2410
- None,
2411
- None,
2412
- None,
2413
- [],
2414
- [],
2415
- ),
2416
- (
2417
- UUID("c3a05b5f-5d9b-4000-a1d0-2dafaecd801f"),
2418
- "卓球部",
2419
- "たっきゅうぶ",
2420
- "卓球部のたい焼き屋さん",
2421
- None,
2422
- True,
2423
- True,
2424
- True,
2425
- "工南-17",
2426
- None,
2427
- None,
2428
- None,
2429
- None,
2430
- None,
2431
- [],
2432
- [],
2433
- ),
2434
- (
2435
- UUID("dc409c5d-bb74-4800-ae20-4e2eddba5d6d"),
2436
- "男子ソフトボール部",
2437
- "だんしそふとぼーるぶ",
2438
- "フランクフルト・ドリンクの販売",
2439
- None,
2440
- True,
2441
- True,
2442
- True,
2443
- "工北-17",
2444
- None,
2445
- None,
2446
- None,
2447
- None,
2448
- None,
2449
- [],
2450
- [],
2451
- ),
2452
- (
2453
- UUID("78c32edf-b7f4-4000-bc61-976fdbfa3027"),
2454
- "男女バレーボール部",
2455
- "だんじょばれーぼーるぶ",
2456
- "チョコバナナ",
2457
- None,
2458
- True,
2459
- True,
2460
- False,
2461
- "工北-04",
2462
- None,
2463
- None,
2464
- None,
2465
- None,
2466
- None,
2467
- [],
2468
- [],
2469
- ),
2470
- (
2471
- UUID("3fc43e8d-ded8-4e00-9fe2-1f46ef6c6742"),
2472
- "地域子ども研究会あらぐさ",
2473
- "ちいきこどもけんきゅうかいあらぐさ",
2474
- "スーパーボールすくい・まとあて",
2475
- None,
2476
- True,
2477
- True,
2478
- False,
2479
- "教-07",
2480
- None,
2481
- None,
2482
- None,
2483
- None,
2484
- None,
2485
- [],
2486
- [],
2487
- ),
2488
- (
2489
- UUID("9a5ce5c0-1022-4800-8d2e-72e008113b78"),
2490
- "地球科学科",
2491
- "ちきゅうかがくか",
2492
- "地層パフェ",
2493
- None,
2494
- True,
2495
- True,
2496
- True,
2497
- "理-11",
2498
- None,
2499
- None,
2500
- None,
2501
- None,
2502
- None,
2503
- [],
2504
- [],
2505
- ),
2506
- (
2507
- UUID("18f83905-c6c5-4800-8c7c-1c82e362ebc7"),
2508
- "中国留学生学友会",
2509
- "ちゅうごくりゅうがくせいがくゆうかい",
2510
- "中華料理店",
2511
- None,
2512
- True,
2513
- True,
2514
- True,
2515
- "留-01",
2516
- None,
2517
- None,
2518
- None,
2519
- None,
2520
- None,
2521
- [],
2522
- [],
2523
- ),
2524
- (
2525
- UUID("345a6a97-9ecd-4000-9a2d-354bcf66e78d"),
2526
- "燃焼系",
2527
- "ねんしょうけい",
2528
- "焼き鳥・グラデーションジュース",
2529
- None,
2530
- True,
2531
- True,
2532
- True,
2533
- "本-05",
2534
- None,
2535
- None,
2536
- None,
2537
- None,
2538
- None,
2539
- [],
2540
- [],
2541
- ),
2542
- (
2543
- UUID("a41f7c74-8d1b-4000-920f-be3a468da653"),
2544
- "八木澤研究室",
2545
- "やぎさわけんきゅうしつ",
2546
- "あげぎょうざ",
2547
- None,
2548
- True,
2549
- True,
2550
- True,
2551
- "理-12",
2552
- None,
2553
- None,
2554
- None,
2555
- None,
2556
- None,
2557
- [],
2558
- [],
2559
- ),
2560
- (
2561
- UUID("d832901e-51f9-4800-ac19-480f28fcf277"),
2562
- "陸上競技部",
2563
- "りくじょうきょうぎぶ",
2564
- "飲み物の売り歩き",
2565
- None,
2566
- True,
2567
- True,
2568
- True,
2569
- "未設定",
2570
- None,
2571
- None,
2572
- None,
2573
- None,
2574
- None,
2575
- [],
2576
- [],
2577
- ),
2578
- (
2579
- UUID("e787e4af-e9c6-4800-b3c3-f257f4e31b1d"),
2580
- "陸上競技部",
2581
- "りくじょうきょうぎぶ",
2582
- "ちばりくうどん",
2583
- None,
2584
- True,
2585
- True,
2586
- True,
2587
- "教-12",
2588
- None,
2589
- None,
2590
- None,
2591
- None,
2592
- None,
2593
- [],
2594
- [],
2595
- ),
2596
- (
2597
- UUID("760fbb6b-0ba8-4400-bb07-ddb585d47258"),
2598
- "躰道部",
2599
- "たいどうぶ",
2600
- "未設定",
2601
- None,
2602
- False,
2603
- False,
2604
- False,
2605
- "未設定",
2606
- None,
2607
- None,
2608
- None,
2609
- None,
2610
- None,
2611
- [],
2612
- [],
2613
- ),
2614
- (
2615
- UUID("4e550374-9f80-4c00-a72a-81ba4fc06502"),
2616
- "躰道部",
2617
- "たいどうぶ",
2618
- "餃子、抹茶ラテの販売",
2619
- None,
2620
- True,
2621
- True,
2622
- True,
2623
- "工南-04",
2624
- None,
2625
- None,
2626
- None,
2627
- None,
2628
- None,
2629
- [],
2630
- [],
2631
- ),
2632
- (
2633
- UUID("f27d0dac-4499-4000-b93e-86d6224ce970"),
2634
- "躰道部",
2635
- "たいどうぶ",
2636
- "演武",
2637
- None,
2638
- True,
2639
- True,
2640
- True,
2641
- "D1-14:00~14:30/D2-12:00~12:30/D3-12:20~12:50",
2642
- None,
2643
- None,
2644
- None,
2645
- None,
2646
- None,
2647
- [],
2648
- [],
2649
- ),
2650
- (
2651
- UUID("1bcda72f-42e5-4700-8de6-d397a1728b71"),
2652
- "ダブルダッチサークルAX",
2653
- "だぶるだっちさーくるあっくす",
2654
- "ダブルダッチパフォーマンス",
2655
- None,
2656
- True,
2657
- True,
2658
- True,
2659
- "D1-11:00~11:30/D2-10:00~10:30/D3-9:00~9:30&11:50~12:20",
2660
- None,
2661
- None,
2662
- None,
2663
- None,
2664
- None,
2665
- [],
2666
- [],
2667
- ),
2668
- (
2669
- UUID("2cd08ad1-137e-4e00-9668-456889bf76ad"),
2670
- "ダブルダッチサークルAX",
2671
- "だぶるだっちさーくるあっくす",
2672
- "ダブルダッチパフォーマンス",
2673
- None,
2674
- True,
2675
- True,
2676
- True,
2677
- "D1 9:50~10:50, D2 13:30~14:00, D3 13:00~13:30",
2678
- None,
2679
- None,
2680
- None,
2681
- None,
2682
- None,
2683
- [],
2684
- [],
2685
- ),
2686
- (
2687
- UUID("3bc3e353-5d88-4c00-9de1-f1a9aec42597"),
2688
- "コピーダンスサークル:Drop",
2689
- "こぴーだんすさーくるどろっぷ",
2690
- "コピーダンスパフォーマンス",
2691
- None,
2692
- True,
2693
- True,
2694
- True,
2695
- "D1-11:30~12:00&14:30~15:00&16:00~16:30/D2-9:30~10:00&16:30~17:00/D3-10:00~10:30&13:20~13:50",
2696
- None,
2697
- None,
2698
- None,
2699
- None,
2700
- None,
2701
- [],
2702
- [],
2703
- ),
2704
- (
2705
- UUID("4b9a701b-cdcb-4800-a5cd-380de6e5fc14"),
2706
- "コピーダンスサークル:Drop",
2707
- "こぴーだんすさーくるどろっぷ",
2708
- "コピーダンスパフォーマンス",
2709
- None,
2710
- True,
2711
- True,
2712
- True,
2713
- "語らいの森\u3000特設ステージ",
2714
- None,
2715
- None,
2716
- None,
2717
- None,
2718
- None,
2719
- [],
2720
- [],
2721
- ),
2722
- (
2723
- UUID("ead171b7-4688-4800-b568-b8dba3444549"),
2724
- "モダンダンス部",
2725
- "もだんだんすぶ",
2726
- "モダンダンス部ダンス場公演",
2727
- None,
2728
- False,
2729
- False,
2730
- True,
2731
- "未設定",
2732
- None,
2733
- None,
2734
- None,
2735
- None,
2736
- None,
2737
- [],
2738
- [],
2739
- ),
2740
- (
2741
- UUID("958837b1-76c3-4800-8ac4-1bd8bb61bd44"),
2742
- "モダンダンス部",
2743
- "もだんだんすぶ",
2744
- "モダンダンス部ステージ公演",
2745
- None,
2746
- False,
2747
- True,
2748
- False,
2749
- "D1 12:30~13:00",
2750
- None,
2751
- None,
2752
- None,
2753
- None,
2754
- None,
2755
- [],
2756
- [],
2757
- ),
2758
- (
2759
- UUID("2697931a-b35b-4c00-934b-c98d59ad9dfa"),
2760
- "競技ダンス部",
2761
- "きょうぎだんすぶ",
2762
- "競技ダンス部\u3000ステージパフォーマンス",
2763
- None,
2764
- True,
2765
- True,
2766
- False,
2767
- "D1 13:25~14:25, D2 16:00~16:30",
2768
- None,
2769
- None,
2770
- None,
2771
- None,
2772
- None,
2773
- [],
2774
- [],
2775
- ),
2776
- (
2777
- UUID("e609e0d6-142a-4000-b304-f06b0a15606f"),
2778
- "競技ダンス部",
2779
- "きょうぎだんすぶ",
2780
- "いももち",
2781
- None,
2782
- True,
2783
- True,
2784
- True,
2785
- "工南-03",
2786
- None,
2787
- None,
2788
- None,
2789
- None,
2790
- None,
2791
- [],
2792
- [],
2793
- ),
2794
- (
2795
- UUID("ec540522-c971-4800-b62a-029164b89a78"),
2796
- "民族舞踊部",
2797
- "みんぞくぶようぶ",
2798
- "民族舞踊のパフォーマンス",
2799
- None,
2800
- False,
2801
- True,
2802
- False,
2803
- "D2 13:00~13:30",
2804
- None,
2805
- None,
2806
- None,
2807
- None,
2808
- None,
2809
- [],
2810
- [],
2811
- ),
2812
- (
2813
- UUID("35cd1b87-bfdd-4600-9ae6-8dc3dfee929c"),
2814
- "C-raft Lab",
2815
- "くらふとらぼ",
2816
- "くらふとの森",
2817
- None,
2818
- True,
2819
- True,
2820
- True,
2821
- "未設定",
2822
- None,
2823
- None,
2824
- None,
2825
- None,
2826
- None,
2827
- [],
2828
- [],
2829
- ),
2830
- (
2831
- UUID("48530578-4eaf-4800-a429-82bc2757c4dd"),
2832
- "ボランティア活動支援団体\u3000C-vol",
2833
- "ぼらんてぃあかつどうだんたいしーぼる",
2834
- "ちばのとマルシェ",
2835
- None,
2836
- True,
2837
- True,
2838
- True,
2839
- "未設定",
2840
- None,
2841
- None,
2842
- None,
2843
- None,
2844
- None,
2845
- [],
2846
- [],
2847
- ),
2848
- (
2849
- UUID("200f7546-8848-4400-9007-baa3442461b8"),
2850
- "CUAD",
2851
- "くあっど",
2852
- "かたらいの森インスタレーション",
2853
- None,
2854
- True,
2855
- True,
2856
- True,
2857
- "未設定",
2858
- None,
2859
- None,
2860
- None,
2861
- None,
2862
- None,
2863
- [],
2864
- [],
2865
- ),
2866
- (
2867
- UUID("4f47e75d-1e9f-4000-a7a3-f3ae8f4fa0a8"),
2868
- "ソングリーディングチームBELINDA",
2869
- "そんぐりーでぃんぐちーむべりんだ",
2870
- "ソングリーディングSHOW”BELINDA-FES”",
2871
- None,
2872
- False,
2873
- True,
2874
- False,
2875
- "未設定",
2876
- None,
2877
- None,
2878
- None,
2879
- None,
2880
- None,
2881
- [],
2882
- [],
2883
- ),
2884
- (
2885
- UUID("e49c51de-8e25-4000-b24e-28ef4712d006"),
2886
- "ソングリーディングチームBELINDA",
2887
- "そんぐりーでぃんぐちーむべりんだ",
2888
- 'ソングリーディングSHOW "BELINDA_FES"',
2889
- None,
2890
- True,
2891
- False,
2892
- False,
2893
- "D1 15:25~15:30",
2894
- None,
2895
- None,
2896
- None,
2897
- None,
2898
- None,
2899
- [],
2900
- [],
2901
- ),
2902
- (
2903
- UUID("261538e6-fe4b-4400-930a-9c737f25da03"),
2904
- "アルティメット同好会MISTRAL",
2905
- "あるてぃめっとどうこうかいみすとらる",
2906
- "ストラックアウト",
2907
- None,
2908
- True,
2909
- True,
2910
- True,
2911
- "未設定",
2912
- None,
2913
- None,
2914
- None,
2915
- None,
2916
- None,
2917
- [],
2918
- [],
2919
- ),
2920
- (
2921
- UUID("56b30dca-86d6-4000-ab59-86e5436b3f68"),
2922
- "教育学部音楽科",
2923
- "きょういくがくぶおんがくか",
2924
- "教育学部音楽科コンサート",
2925
- None,
2926
- False,
2927
- True,
2928
- False,
2929
- "未設定",
2930
- None,
2931
- None,
2932
- None,
2933
- None,
2934
- None,
2935
- [],
2936
- [],
2937
- ),
2938
- (
2939
- UUID("ffc546b2-7e04-4800-bfe2-a3593f02253b"),
2940
- "生協学生委員会",
2941
- "せいきょうがくせいいいんかい",
2942
- "呪われた日本屋敷~響くナニカの足音",
2943
- None,
2944
- True,
2945
- True,
2946
- True,
2947
- "フードコート1,2",
2948
- None,
2949
- None,
2950
- None,
2951
- "フードコート2でお化け屋敷を実施\n待機列をフードコート1に誘導",
2952
- None,
2953
- [],
2954
- [],
2955
- ),
2956
- (
2957
- UUID("d780cdef-1f18-4800-abc0-66f78f8c0bb6"),
2958
- "茶道部",
2959
- "さどうぶ",
2960
- "大学祭茶会",
2961
- None,
2962
- True,
2963
- True,
2964
- True,
2965
- "未設定",
2966
- None,
2967
- None,
2968
- None,
2969
- None,
2970
- None,
2971
- [],
2972
- [],
2973
- ),
2974
- (
2975
- UUID("2db49fef-6d74-4400-96da-4ff7b6ba59e9"),
2976
- "馬術部",
2977
- "ばじゅつぶ",
2978
- "馬とのふれあい体験、蹄鉄販売",
2979
- None,
2980
- True,
2981
- True,
2982
- True,
2983
- "未設定",
2984
- None,
2985
- None,
2986
- None,
2987
- None,
2988
- None,
2989
- [],
2990
- [],
2991
- ),
2992
- (
2993
- UUID("11ea000f-d526-4c00-88f5-0007ea930605"),
2994
- "ジャグリングチームPossum",
2995
- "じゃぐりんぐちーむぽっさむ",
2996
- "ジャグリングパフォーマンス",
2997
- None,
2998
- True,
2999
- True,
3000
- False,
3001
- "D1-9:30~10:00/D2-14:00~14:30",
3002
- None,
3003
- None,
3004
- None,
3005
- None,
3006
- None,
3007
- [],
3008
- [],
3009
- ),
3010
- (
3011
- UUID("a3da11f7-ad53-4800-91ed-08fbd6a9d2cd"),
3012
- "ジャグリングチームPossum",
3013
- "じゃぐりんぐちーむぽっさむ",
3014
- "ジャグリングパフォーマンス",
3015
- None,
3016
- True,
3017
- False,
3018
- False,
3019
- "D1 10:50~11:20",
3020
- None,
3021
- None,
3022
- None,
3023
- None,
3024
- None,
3025
- [],
3026
- [],
3027
- ),
3028
- (
3029
- UUID("22d5b6c8-3549-4400-916a-db641aa4da58"),
3030
- "ストリートダンスサークルDLC",
3031
- "すとりーとだんすさーくるでぃーえるしー",
3032
- "ダンスパフォーマンス",
3033
- None,
3034
- False,
3035
- True,
3036
- False,
3037
- "D2-11:00~12:00",
3038
- None,
3039
- None,
3040
- None,
3041
- None,
3042
- None,
3043
- [],
3044
- [],
3045
- ),
3046
- (
3047
- UUID("ae0e5932-cce5-4000-9707-2c996672d664"),
3048
- "ストリートダンスサークルDLC",
3049
- "すとりーとだんすさーくるでぃーえるしー",
3050
- "ダンスパフォーマンス",
3051
- None,
3052
- False,
3053
- True,
3054
- False,
3055
- "D2 15:00~16:00",
3056
- None,
3057
- None,
3058
- None,
3059
- None,
3060
- None,
3061
- [],
3062
- [],
3063
- ),
3064
- (
3065
- UUID("f926c6e4-1ee9-4000-bc93-63720f74a63f"),
3066
- "キャンピングツアー部",
3067
- "きゃんぴんぐつあーぶ",
3068
- "キャンプでスモア!",
3069
- None,
3070
- True,
3071
- True,
3072
- True,
3073
- "本-03",
3074
- None,
3075
- None,
3076
- None,
3077
- None,
3078
- None,
3079
- [],
3080
- [],
3081
- ),
3082
- (
3083
- UUID("cb08b18d-3331-4800-a584-58c69998d358"),
3084
- "チアリーディングサークルLips",
3085
- "ちありーでぃんぐさーくるりっぷす",
3086
- "Lips Cheerleading",
3087
- None,
3088
- False,
3089
- True,
3090
- False,
3091
- "未設定",
3092
- None,
3093
- None,
3094
- None,
3095
- None,
3096
- None,
3097
- [],
3098
- [],
3099
- ),
3100
- (
3101
- UUID("c5ab105d-51cf-4000-a2d5-882ea8e7b158"),
3102
- "チアリーディングサークルLips",
3103
- "ちありーでぃんぐさーくるりっぷす",
3104
- "ダンスパフォーマンス",
3105
- None,
3106
- True,
3107
- True,
3108
- True,
3109
- "D1-12:10~13:00/D2-12:40~13:30/D3-11:00~11:50",
3110
- None,
3111
- None,
3112
- None,
3113
- None,
3114
- None,
3115
- [],
3116
- [],
3117
- ),
3118
- (
3119
- UUID("948a4753-5a1a-4800-8a45-23a9ad0d7b95"),
3120
- "カードゲームサークル<CCC>",
3121
- "かーどげーむさーくるしーしーしー",
3122
- "CCC祭",
3123
- None,
3124
- True,
3125
- True,
3126
- True,
3127
- "G4-51",
3128
- None,
3129
- None,
3130
- None,
3131
- None,
3132
- None,
3133
- [],
3134
- [],
3135
- ),
3136
- (
3137
- UUID("fa66f951-5434-4000-bd33-7ca8aa1a1f52"),
3138
- "ラブライブ!研究会",
3139
- "らぶらいぶけんきゅうかい",
3140
- "Festival with You!! みんなで作る祭り",
3141
- None,
3142
- True,
3143
- True,
3144
- True,
3145
- "G4-33",
3146
- None,
3147
- None,
3148
- None,
3149
- None,
3150
- None,
3151
- [],
3152
- [],
3153
- ),
3154
- (
3155
- UUID("978b96e3-881f-4800-8bc5-cb71c40f9b99"),
3156
- "教育学部家庭科22",
3157
- "きょういくがくぶかていかにに",
3158
- "韓国スイーツ「クルンジ」",
3159
- None,
3160
- True,
3161
- True,
3162
- True,
3163
- "教-16",
3164
- None,
3165
- None,
3166
- None,
3167
- None,
3168
- None,
3169
- [],
3170
- [],
3171
- ),
3172
- (
3173
- UUID("786b1b1e-4b83-4400-bc35-8d8f25c1d232"),
3174
- "中学校社会科",
3175
- "ちゅうがっこうしゃかいか",
3176
- "中社あげぱん",
3177
- None,
3178
- True,
3179
- True,
3180
- True,
3181
- "工南-07",
3182
- None,
3183
- None,
3184
- None,
3185
- None,
3186
- None,
3187
- [],
3188
- [],
3189
- ),
3190
- (
3191
- UUID("6a6f4d79-6d75-4400-b537-a6bcb6baa238"),
3192
- "縫製技術研究会",
3193
- "ほうせいぎじゅつけんきゅうかい",
3194
- "Ho-ken collection 2025",
3195
- None,
3196
- True,
3197
- False,
3198
- False,
3199
- "D1 14:25~15:25",
3200
- None,
3201
- None,
3202
- None,
3203
- None,
3204
- None,
3205
- [],
3206
- [],
3207
- ),
3208
- (
3209
- UUID("cd957515-1256-4000-a6ca-ba8a892b4f7a"),
3210
- "たつぽっぷ",
3211
- "たつぽっぷ",
3212
- "未設定",
3213
- None,
3214
- True,
3215
- True,
3216
- True,
3217
- "工北-19",
3218
- None,
3219
- None,
3220
- None,
3221
- None,
3222
- None,
3223
- [],
3224
- [],
3225
- ),
3226
- (
3227
- UUID("20a8288c-0f21-4c00-9054-14460790ddad"),
3228
- "RING",
3229
- "りんぐ",
3230
- "りんぐべーぐる",
3231
- None,
3232
- True,
3233
- True,
3234
- True,
3235
- "工北-21",
3236
- None,
3237
- None,
3238
- None,
3239
- None,
3240
- None,
3241
- [],
3242
- [],
3243
- ),
3244
- (
3245
- UUID("c157bc03-6d0d-4000-a0ab-de01b686bfc5"),
3246
- "デー祭",
3247
- "でーさい",
3248
- "デー祭",
3249
- None,
3250
- True,
3251
- True,
3252
- True,
3253
- "未設定",
3254
- None,
3255
- None,
3256
- None,
3257
- None,
3258
- None,
3259
- [],
3260
- [],
3261
- ),
3262
- (
3263
- UUID("72911c9f-e475-4800-b948-8e4ff23aec54"),
3264
- "教育学部ものづくり選修•技術科",
3265
- "きょういくがくぶものづくりせんしゅうぎじゅつか",
3266
- "ベビーカステラ",
3267
- None,
3268
- False,
3269
- False,
3270
- False,
3271
- "工南-13",
3272
- None,
3273
- None,
3274
- None,
3275
- None,
3276
- None,
3277
- [],
3278
- [],
3279
- ),
3280
- (
3281
- UUID("7694fc92-0f4b-4c00-bb4a-7e4907a596aa"),
3282
- "Project T",
3283
- "ぷろじぇくとてぃー",
3284
- "えびせん焼きそば",
3285
- None,
3286
- True,
3287
- True,
3288
- True,
3289
- "理-02",
3290
- None,
3291
- None,
3292
- None,
3293
- None,
3294
- None,
3295
- [],
3296
- [],
3297
- ),
3298
- (
3299
- UUID("c64fbf3b-0b83-4000-a327-df9d85c1987f"),
3300
- "小国25",
3301
- "しょうこく",
3302
- "小国焼きそば",
3303
- None,
3304
- False,
3305
- False,
3306
- False,
3307
- "教-03",
3308
- None,
3309
- None,
3310
- None,
3311
- None,
3312
- None,
3313
- [],
3314
- [],
3315
- ),
3316
- (
3317
- UUID("caeb4adf-448e-4000-a575-a56fa2471910"),
3318
- "ものぶ〜",
3319
- "ものぶー",
3320
- "モノギマーケット",
3321
- None,
3322
- True,
3323
- True,
3324
- True,
3325
- "共通演習室3",
3326
- None,
3327
- None,
3328
- None,
3329
- None,
3330
- None,
3331
- [],
3332
- [],
3333
- ),
3334
- (
3335
- UUID("e22e88a4-82c1-4000-b117-445241609f82"),
3336
- "サイクリング部",
3337
- "さいくりんぐぶ",
3338
- "輪タク",
3339
- None,
3340
- True,
3341
- True,
3342
- True,
3343
- "未設定",
3344
- None,
3345
- None,
3346
- None,
3347
- None,
3348
- None,
3349
- [],
3350
- [],
3351
- ),
3352
- (
3353
- UUID("9d82d3f8-b2a4-4000-8ec1-69fc595258f2"),
3354
- "サイクリング部",
3355
- "さいくりんぐぶ",
3356
- "旅するホットサンド",
3357
- None,
3358
- True,
3359
- True,
3360
- True,
3361
- "本-02",
3362
- None,
3363
- None,
3364
- None,
3365
- None,
3366
- None,
3367
- [],
3368
- [],
3369
- ),
3370
- (
3371
- UUID("f15a8e8a-f939-4800-b8ad-47457c9ccdab"),
3372
- "インドネシア文化交流会",
3373
- "いんどねしあぶんかこうりゅうかい",
3374
- "インドネシアのサテ(焼き鳥)コーナー",
3375
- None,
3376
- True,
3377
- True,
3378
- True,
3379
- "留-04",
3380
- None,
3381
- None,
3382
- None,
3383
- None,
3384
- None,
3385
- [],
3386
- [],
3387
- ),
3388
- (
3389
- UUID("903f6819-6ed3-4800-881f-b40cb769d41a"),
3390
- "君の夢飾り",
3391
- "きみのゆめかざり",
3392
- "夢飾りアクセサリーマルシェ",
3393
- None,
3394
- True,
3395
- True,
3396
- True,
3397
- "留-03",
3398
- None,
3399
- None,
3400
- None,
3401
- None,
3402
- None,
3403
- [],
3404
- [],
3405
- ),
3406
- (
3407
- UUID("504f400a-ed0a-4000-a827-a00576855787"),
3408
- "数学・情報数理学科",
3409
- "すうがくじょうほうすうりがっか",
3410
- "出張!数学リフレッシュタイム",
3411
- None,
3412
- True,
3413
- True,
3414
- True,
3415
- "102講義室",
3416
- None,
3417
- None,
3418
- None,
3419
- None,
3420
- None,
3421
- [],
3422
- [],
3423
- ),
3424
- (
3425
- UUID("8ed6f10b-8b49-4800-876b-7885c5a4ca33"),
3426
- "男女ソフトテニス部",
3427
- "だんじょそふとてにすぶ",
3428
- "焼きそば・フランクフルト",
3429
- None,
3430
- True,
3431
- True,
3432
- True,
3433
- "理-05",
3434
- None,
3435
- None,
3436
- None,
3437
- None,
3438
- None,
3439
- [],
3440
- [],
3441
- ),
3442
- (
3443
- UUID("c60b2572-c56c-4800-a305-92b962b63462"),
3444
- "苔なかま",
3445
- "こけなかま",
3446
- "コケリウム",
3447
- None,
3448
- True,
3449
- True,
3450
- False,
3451
- "共通演習室4",
3452
- None,
3453
- None,
3454
- None,
3455
- None,
3456
- None,
3457
- [],
3458
- [],
3459
- ),
3460
- (
3461
- UUID("12442877-0523-4000-8922-143b8291a836"),
3462
- "ジークンドーサークル",
3463
- "じーくんどーさーくる",
3464
- "焼きドーナツ",
3465
- None,
3466
- True,
3467
- True,
3468
- True,
3469
- "理-19",
3470
- None,
3471
- None,
3472
- None,
3473
- None,
3474
- None,
3475
- [],
3476
- [],
3477
- ),
3478
- (
3479
- UUID("2ddc886e-afd7-4400-96ee-443757ebca4d"),
3480
- "競技かるた会",
3481
- "きょうぎかるたかい",
3482
- "わたあめ",
3483
- None,
3484
- True,
3485
- True,
3486
- True,
3487
- "理-18",
3488
- None,
3489
- None,
3490
- None,
3491
- None,
3492
- None,
3493
- [],
3494
- [],
3495
- ),
3496
- (
3497
- UUID("325dea73-047c-4a00-992e-f539823e0c9d"),
3498
- "バトントワリングサークル",
3499
- "ばとんとわりんぐさーくる",
3500
- "バトントワリングパフォーマンス",
3501
- None,
3502
- True,
3503
- False,
3504
- False,
3505
- "D1-13:20~13:30",
3506
- None,
3507
- None,
3508
- None,
3509
- None,
3510
- None,
3511
- [],
3512
- [],
3513
- ),
3514
- (
3515
- UUID("14e1b83e-33e4-4800-8a70-dc1f19f213c1"),
3516
- "ITC",
3517
- "あいてぃーしー",
3518
- "未設定",
3519
- None,
3520
- False,
3521
- False,
3522
- False,
3523
- "工南-15",
3524
- None,
3525
- None,
3526
- None,
3527
- None,
3528
- None,
3529
- [],
3530
- [],
3531
- ),
3532
- (
3533
- UUID("5d3df2cf-6c0f-4c00-ae9e-f967b607fe69"),
3534
- "English House Student Society(EHSS)",
3535
- "いんぐりっしゅはうすすちゅーでんとそさえてぃー",
3536
- "未設定",
3537
- None,
3538
- False,
3539
- True,
3540
- True,
3541
- "未設定",
3542
- None,
3543
- None,
3544
- None,
3545
- None,
3546
- None,
3547
- [],
3548
- [],
3549
- ),
3550
  ]
 
1
  from uuid import UUID
2
 
3
  [
4
+ {
5
+ "id": UUID("cbd30506-3726-4000-a5e9-82831b9361b8"),
6
+ "circleName": "マジックサークル",
7
+ "circleNameKana": "まじっくさーくる",
8
+ "name": "マジックショー",
9
+ "category": None,
10
+ "firstDay": True,
11
+ "secondDay": True,
12
+ "thirdDay": True,
13
+ "location": "G4-21",
14
+ "description": None,
15
+ "prSummary": None,
16
+ "prDetail": None,
17
+ "note": "撮影禁止",
18
+ "primaryImage": {
19
+ "filename": ...,
20
+ "extension": ...,
21
+ },
22
+ "optionalImages": [
23
+ {
24
+ "filename": ...,
25
+ "extension": ...,
26
+ },
27
+ {
28
+ "filename": ...,
29
+ "extension": ...,
30
+ },
31
+ ...,
32
+ ],
33
+ "urls": [
34
+ {
35
+ "service": ...,
36
+ "userPrefix": ...,
37
+ },
38
+ {
39
+ "service": ...,
40
+ "userPrefix": ...,
41
+ },
42
+ ...,
43
+ ],
44
+ },
45
+ ...,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  ]
app/repositories/projects_repository.py CHANGED
@@ -1,7 +1,7 @@
1
  from typing import Any, Dict, List
2
 
3
- from psycopg.rows import dict_row
4
- from psycopg.errors import DatabaseError
5
 
6
  from utils.logger import setup_logger
7
 
@@ -10,58 +10,33 @@ from schemas.projects import Project
10
 
11
  log = setup_logger(__name__)
12
 
13
- # TODO: カラム名の確認
14
- _COLUMN_MAP: Dict[str, str] = {
15
- "project_id": "projectId",
16
- "circle_name": "circleName",
17
- "circle_name_kana": "circleNameKana",
18
- "name": "name",
19
- "category": "category",
20
- "first_day": "firstDay",
21
- "second_day": "secondDay",
22
- "third_day": "thirdDay",
23
- "location": "location",
24
- "description": "description",
25
- "pr_comment": "prComment",
26
- "pr_comment_long": "prCommentLong",
27
- "note": "note",
28
- "image_name": "imageName",
29
- "optional_image_name1": "optionalImageName1",
30
- "optional_image_name2": "optionalImageName2",
31
- "optional_image_name3": "optionalImageName3",
32
- "optional_image_name4": "optionalImageName4",
33
- "optional_image_name5": "optionalImageName5",
34
- "url_x": "urlX",
35
- "url_instagram": "urlInstagram",
36
- "url_official_website": "urlOfficialWebsite",
37
- "url_youtube": "urlYoutube",
38
- "url_others": "urlOthers",
39
- }
40
-
41
- _SELECT_COLUMNS = ", ".join(_COLUMN_MAP.keys())
42
 
43
 
44
  class ProjectsRepository:
45
- """企画データを CockroachDB から取得するリポジトリ。"""
46
 
47
  def __init__(self, table_name: str = "projects"):
48
  self.table_name = table_name
49
 
50
  def list_projects(self) -> List[Project]:
51
  """データベースから企画一覧を取得する"""
52
- query = f"SELECT {_SELECT_COLUMNS} FROM {self.table_name} ORDER BY project_id"
53
  try:
54
  with get_connection() as conn:
55
- with conn.cursor(row_factory=dict_row) as cur:
56
  cur.execute(query)
57
  rows = cur.fetchall()
58
- except DatabaseError as exc:
59
  log.error(f"企画データの一覧取得に失敗しました: {exc}")
60
  raise
61
 
62
  return [self._transform_row(row) for row in rows]
63
 
64
  def _transform_row(self, row: Dict[str, Any]) -> Project:
65
- # カラム名とAPIレスポンスのキーをマッピングし、未指定の場合は None を補う。
66
- mapped = {alias: row.get(column) for column, alias in _COLUMN_MAP.items()}
 
 
67
  return Project(**mapped)
 
1
  from typing import Any, Dict, List
2
 
3
+ from pymysql import MySQLError
4
+ from pymysql.cursors import DictCursor
5
 
6
  from utils.logger import setup_logger
7
 
 
10
 
11
  log = setup_logger(__name__)
12
 
13
+ with open("app/repositories/query.sql") as file:
14
+ SQL_QUERY = file.read()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
 
17
  class ProjectsRepository:
18
+ """企画データを MySQL から取得するリポジトリ。"""
19
 
20
  def __init__(self, table_name: str = "projects"):
21
  self.table_name = table_name
22
 
23
  def list_projects(self) -> List[Project]:
24
  """データベースから企画一覧を取得する"""
25
+ query = SQL_QUERY
26
  try:
27
  with get_connection() as conn:
28
+ with conn.cursor(DictCursor) as cur:
29
  cur.execute(query)
30
  rows = cur.fetchall()
31
+ except MySQLError as exc:
32
  log.error(f"企画データの一覧取得に失敗しました: {exc}")
33
  raise
34
 
35
  return [self._transform_row(row) for row in rows]
36
 
37
  def _transform_row(self, row: Dict[str, Any]) -> Project:
38
+ """
39
+ 行からProjectオブジェクトを生成する
40
+ """
41
+ mapped = ...
42
  return Project(**mapped)
config/db/connection.md DELETED
@@ -1,21 +0,0 @@
1
- # CockroachDB 接続ガイド
2
-
3
- ## 環境変数
4
- - `DATABASE_URL`: CockroachDB から共有された DSN。例: `postgresql://hogehoge:password@foobar.aws-ap-southeast-1.cockroachlabs.cloud:26257/defaultdb?sslmode=verify-full`
5
- - `SSL_ROOT_CERT`: 公式 CA 証明書のパス。`sslmode=verify-full` の場合は必須。
6
- - `DB_POOL_MIN_SIZE` / `DB_POOL_MAX_SIZE` / `DB_POOL_MAX_WAIT` (任意): psycopg のコネクションプール調整用。未設定時は `1 / 5 / 5.0` を使用。
7
-
8
- > パスワードが DSN に含まれていない場合は、`urllib.parse.quote_plus` で URL エンコードした値を差し込みます。
9
-
10
- ## 接続オプション
11
- - CockroachDB Cloud Serverless で "unknown cluster" エラーが発生する場合は、`options=--cluster%3D<CLUSTER>` を DSN クエリに追加してください。
12
- - `sslmode=verify-full` を指定する際は、`SSL_ROOT_CERT` で CA 証明書を指し示します。証明書ファイルはリポジトリに含めず、Secrets Manager や環境変数から渡してください。
13
-
14
- ## psycopg3 の利用
15
- - `app/db/session.py` で `psycopg_pool.ConnectionPool` を利用しています。読み取り用途のため、取得したコネクションはオートコミットに切り替えています。
16
- - CockroachDB 既定の分離レベルは `SERIALIZABLE` のため、書き込み処理を追加する際は `psycopg.errors.SerializationFailure (SQLSTATE 40001)` をリトライする実装を検討してください。
17
-
18
- ## 動作確認
19
- 1. `export DATABASE_URL="..."` と `export SSL_ROOT_CERT="/path/to/cc-ca.crt"` をセット。
20
- 2. `python -c "from app.db.session import get_connection;\nwith get_connection() as conn: print(conn.info.host)"`
21
- 3. エラーなくホスト名が表示されれば接続成功です。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
docs/db_connection.md ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # MySQL 接続ガイド
2
+
3
+ ## 環境変数
4
+ - `DATABASE_URL`: MySQL の DSN。例: `mysql://user:password@db.example.com:3306/chibafes?charset=utf8mb4`
5
+ - `SSL_ROOT_CERT`: 公式 CA 証明書のパス。サーバ証明書の検証を行う場合に指定します。
6
+ - `DB_POOL_MIN_SIZE` / `DB_POOL_MAX_SIZE`: コネクションプールの初期 / 最大コネクション数。既定値は `1 / 5`。
7
+ - `DB_CONNECT_TIMEOUT`: 接続タイムアウト秒数。未設定時は PyMySQL の既定値を利用します。
8
+ - `DB_CHARSET`: DSN に指定が無い場合の既定文字コード。標準は `utf8mb4`。
9
+
10
+ > パスワードに特殊文字が含まれる場合は、`urllib.parse.quote_plus` で URL エンコードした値を使用してください。
11
+
12
+ ## 接続オプション
13
+ - DSN のクエリ文字列で `charset`, `autocommit`, `connect_timeout` など PyMySQL の接続パラメータを上書きできます。
14
+ - `SSL_ROOT_CERT` を指定すると `ssl={"ca": ...}` が PyMySQL に渡されます。証明書ファイルは Secrets Manager や環境変数経由で提供し、リポジトリに含めないでください。
15
+
16
+ ## PyMySQL の利用
17
+ - `app/db/session.py` では PyMySQL を利用したシンプルなコネクションプールを実装しています。読み取り用途のため、コネクションはオートコミットで取得します。
18
+ - 追加で書き込み処理を実装する場合は、必要に応じてトランザクション管理やリトライ戦略を検討してください。
19
+
20
+ ## 動作確認
21
+ 1. `export DATABASE_URL="..."` と必要な環境変数をセット。
22
+ 2. `python -c "from app.db.session import get_connection;\nwith get_connection() as conn: print(conn.host)"`
23
+ 3. エラーなくホスト名が表示されれば接続成功です。
requirements.txt CHANGED
@@ -18,12 +18,11 @@ numpy==2.3.2
18
  packaging==25.0
19
  pandas==2.3.2
20
  posthog==6.7.6
21
- psycopg==3.2.10
22
  psycopg-binary==3.2.10
23
- psycopg-pool==3.2.6
24
  pybind11==3.0.1
25
  pydantic==2.11.7
26
  pydantic_core==2.33.2
 
27
  python-dateutil==2.9.0.post0
28
  python-dotenv==1.1.1
29
  pytz==2025.2
 
18
  packaging==25.0
19
  pandas==2.3.2
20
  posthog==6.7.6
 
21
  psycopg-binary==3.2.10
 
22
  pybind11==3.0.1
23
  pydantic==2.11.7
24
  pydantic_core==2.33.2
25
+ PyMySQL==1.1.2
26
  python-dateutil==2.9.0.post0
27
  python-dotenv==1.1.1
28
  pytz==2025.2
tests/repositories/test_projects_repository.py CHANGED
@@ -9,49 +9,55 @@ ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
9
  if ROOT not in sys.path:
10
  sys.path.insert(0, ROOT)
11
 
12
- from app.repositories.projects_repository import ProjectsRepository
13
-
14
- if "psycopg" not in sys.modules:
15
- print("Stubbing psycopg and psycopg_pool modules for testing")
16
- psycopg_stub = types.ModuleType("psycopg")
17
 
18
  class Connection: # noqa: D401 - ダミークラス
19
- """psycopg.Connection のスタブ"""
20
 
21
- autocommit = True
 
22
 
23
- psycopg_stub.Connection = Connection
 
 
24
 
25
- rows_stub = types.ModuleType("psycopg.rows")
26
- rows_stub.dict_row = object()
27
 
28
- class DatabaseError(Exception):
29
- pass
30
 
31
- errors_stub = types.ModuleType("psycopg.errors")
32
- errors_stub.DatabaseError = DatabaseError
33
 
34
- pool_stub = types.ModuleType("psycopg_pool")
35
 
36
- class ConnectionPool: # noqa: D401 - ダミークラス
37
- """psycopg_pool.ConnectionPool のスタブ"""
38
 
39
- def __init__(self, *args, **kwargs):
40
- self.args = args
41
- self.kwargs = kwargs
42
 
43
- def connection(self): # pragma: no cover - テストでは使用しない
44
- raise RuntimeError("ConnectionPool stub not implemented")
45
 
46
- def close(self):
47
- pass
48
 
49
- pool_stub.ConnectionPool = ConnectionPool
 
50
 
51
- sys.modules["psycopg"] = psycopg_stub
52
- sys.modules["psycopg.rows"] = rows_stub
53
- sys.modules["psycopg.errors"] = errors_stub
54
- sys.modules["psycopg_pool"] = pool_stub
 
 
 
 
 
 
55
 
56
  if "dotenv" not in sys.modules:
57
  print("Stubbing dotenv module for testing")
 
9
  if ROOT not in sys.path:
10
  sys.path.insert(0, ROOT)
11
 
12
+ if "pymysql" not in sys.modules:
13
+ print("Stubbing pymysql modules for testing")
14
+ pymysql_stub = types.ModuleType("pymysql")
 
 
15
 
16
  class Connection: # noqa: D401 - ダミークラス
17
+ """pymysql.connections.Connection のスタブ"""
18
 
19
+ def __init__(self):
20
+ self._open = True
21
 
22
+ @property
23
+ def open(self): # pragma: no cover - テストでの挙動確認用
24
+ return self._open
25
 
26
+ def autocommit(self, value): # pragma: no cover - 副作用なし
27
+ return None
28
 
29
+ def ping(self, reconnect=False): # pragma: no cover - 副作用なし
30
+ return None
31
 
32
+ def close(self): # pragma: no cover - 副作用なし
33
+ self._open = False
34
 
35
+ cursors_stub = types.ModuleType("pymysql.cursors")
36
 
37
+ class DictCursor: # noqa: D401 - ダミークラス
38
+ """pymysql.cursors.DictCursor のスタブ"""
39
 
40
+ cursors_stub.DictCursor = DictCursor
 
 
41
 
42
+ connections_stub = types.ModuleType("pymysql.connections")
43
+ connections_stub.Connection = Connection
44
 
45
+ class MySQLError(Exception):
46
+ pass
47
 
48
+ def connect(**kwargs): # pragma: no cover - テストで実コネクション不要
49
+ return Connection()
50
 
51
+ pymysql_stub.connect = connect
52
+ pymysql_stub.MySQLError = MySQLError
53
+ pymysql_stub.connections = connections_stub
54
+ pymysql_stub.cursors = cursors_stub
55
+
56
+ sys.modules["pymysql"] = pymysql_stub
57
+ sys.modules["pymysql.cursors"] = cursors_stub
58
+ sys.modules["pymysql.connections"] = connections_stub
59
+
60
+ from app.repositories.projects_repository import ProjectsRepository
61
 
62
  if "dotenv" not in sys.modules:
63
  print("Stubbing dotenv module for testing")
tests/services/test_projects_service.py CHANGED
@@ -7,50 +7,56 @@ ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
7
  if ROOT not in sys.path:
8
  sys.path.insert(0, ROOT)
9
 
10
- from app.services.projects_service import ProjectsService
11
- from schemas.projects import Project
12
-
13
- if "psycopg" not in sys.modules: # psycopg が未インストールでも読み込みできるようにする
14
- print("psycopg not found, using stub")
15
- psycopg_stub = types.ModuleType("psycopg")
16
 
17
  class Connection: # noqa: D401 - ダミークラス
18
- """psycopg.Connection のスタブ"""
19
 
20
- autocommit = True
 
21
 
22
- psycopg_stub.Connection = Connection
 
 
23
 
24
- rows_stub = types.ModuleType("psycopg.rows")
25
- rows_stub.dict_row = object()
26
 
27
- class DatabaseError(Exception):
28
- pass
29
 
30
- errors_stub = types.ModuleType("psycopg.errors")
31
- errors_stub.DatabaseError = DatabaseError
32
 
33
- pool_stub = types.ModuleType("psycopg_pool")
34
 
35
- class ConnectionPool: # noqa: D401 - ダミープール
36
- """psycopg_pool.ConnectionPool のスタブ"""
37
 
38
- def __init__(self, *args, **kwargs):
39
- self.args = args
40
- self.kwargs = kwargs
41
 
42
- def connection(self): # pragma: no cover - テストでは使用しない
43
- raise RuntimeError("ConnectionPool stub not implemented")
44
 
45
- def close(self):
46
- pass
47
 
48
- pool_stub.ConnectionPool = ConnectionPool
 
49
 
50
- sys.modules["psycopg"] = psycopg_stub
51
- sys.modules["psycopg.rows"] = rows_stub
52
- sys.modules["psycopg.errors"] = errors_stub
53
- sys.modules["psycopg_pool"] = pool_stub
 
 
 
 
 
 
 
54
 
55
  if "dotenv" not in sys.modules:
56
  print("dotenv not found, using stub")
 
7
  if ROOT not in sys.path:
8
  sys.path.insert(0, ROOT)
9
 
10
+ if "pymysql" not in sys.modules: # PyMySQL が未インストールでも読み込みできるようにする
11
+ print("pymysql not found, using stub")
12
+ pymysql_stub = types.ModuleType("pymysql")
 
 
 
13
 
14
  class Connection: # noqa: D401 - ダミークラス
15
+ """pymysql.connections.Connection のスタブ"""
16
 
17
+ def __init__(self):
18
+ self._open = True
19
 
20
+ @property
21
+ def open(self): # pragma: no cover - テストでの挙動確認用
22
+ return self._open
23
 
24
+ def autocommit(self, value): # pragma: no cover - 副作用なし
25
+ return None
26
 
27
+ def ping(self, reconnect=False): # pragma: no cover - 副作用なし
28
+ return None
29
 
30
+ def close(self): # pragma: no cover - 副作用なし
31
+ self._open = False
32
 
33
+ cursors_stub = types.ModuleType("pymysql.cursors")
34
 
35
+ class DictCursor: # noqa: D401 - ダミークラス
36
+ """pymysql.cursors.DictCursor のスタブ"""
37
 
38
+ cursors_stub.DictCursor = DictCursor
 
 
39
 
40
+ connections_stub = types.ModuleType("pymysql.connections")
41
+ connections_stub.Connection = Connection
42
 
43
+ class MySQLError(Exception):
44
+ pass
45
 
46
+ def connect(**kwargs): # pragma: no cover - テストで実コネクション不要
47
+ return Connection()
48
 
49
+ pymysql_stub.connect = connect
50
+ pymysql_stub.MySQLError = MySQLError
51
+ pymysql_stub.connections = connections_stub
52
+ pymysql_stub.cursors = cursors_stub
53
+
54
+ sys.modules["pymysql"] = pymysql_stub
55
+ sys.modules["pymysql.cursors"] = cursors_stub
56
+ sys.modules["pymysql.connections"] = connections_stub
57
+
58
+ from app.services.projects_service import ProjectsService
59
+ from schemas.projects import Project
60
 
61
  if "dotenv" not in sys.modules:
62
  print("dotenv not found, using stub")