質問するログイン新規登録

質問編集履歴

2

記入漏れの修正

2021/06/11 02:08

投稿

p19ljk
p19ljk

スコア146

title CHANGED
File without changes
body CHANGED
@@ -135,7 +135,19 @@
135
135
 
136
136
  Base = declarative_base()
137
137
  ```
138
+ ```python
139
+ # database/cruds/user.py
140
+ from sqlalchemy.orm import Session
138
141
 
142
+ from database import models
143
+
144
+ from typing import List
145
+
146
+
147
+ def get_users(db: Session, skip: int = 0, limit: int = 100) -> List[models.User]:
148
+ return db.query(models.User).offset(skip).limit(limit).all()
149
+ ```
150
+
139
151
  ■ API実行用
140
152
  テスト用に作ったもので実際はReactからaxiosで実行しています。
141
153
  ```python

1

最小構成にて「試したこと」追記

2021/06/11 02:08

投稿

p19ljk
p19ljk

スコア146

title CHANGED
File without changes
body CHANGED
@@ -49,6 +49,109 @@
49
49
  return users
50
50
  ```
51
51
 
52
+ 下記のように構成を小さくして再度試してみました。
53
+ 結果的にはやはりプロセスが残っており、上限?の70プロセスで毎回エラーとなります。
54
+ ただし、DBアクセスを行わない'/'へのアクセスではプロセスの残りはなかったので、
55
+ DB周りが怪しいということが分かりました。closeはちゃんとしているんですが。。。
56
+ ■ FastAPI側
57
+ ```python
58
+ # main.py
59
+ from fastapi import Depends, FastAPI, Request, Response
60
+ from fastapi.middleware.cors import CORSMiddleware
61
+ from sqlalchemy.orm import Session
62
+ from typing import List
63
+
64
+ from database import models, schemas
65
+ from database.database import SessionLocal, engine
66
+ from database.cruds import user as crud_user
67
+ from dependencies import get_db
68
+
69
+ models.Base.metadata.create_all(bind=engine)
70
+
71
+ app = FastAPI()
72
+
73
+ app.add_middleware(
74
+ CORSMiddleware,
75
+ allow_origins=["*"],
76
+ allow_credentials=True,
77
+ allow_methods=["*"],
78
+ allow_headers=["*"],
79
+ )
80
+
81
+
82
+ @app.middleware('http')
83
+ async def db_session_middleware(request: Request, call_next):
84
+ response = Response('Internal server error', status_code=500)
85
+ try:
86
+ request.state.db = SessionLocal()
87
+ response = await call_next(request)
88
+ finally:
89
+ request.state.db.close()
90
+
91
+ return response
92
+
93
+
94
+ @app.get("/")
95
+ async def root():
96
+ return {"message": "Hello World!"}
97
+
98
+
99
+ @app.get("/users", response_model=List[schemas.User])
100
+ async def read_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
101
+ users = crud_user.get_users(db, skip=skip, limit=limit)
102
+ return users
103
+
104
+ ```
105
+ ```python
106
+ # dependencies.py
107
+ from fastapi import Request
108
+
109
+
110
+ def get_db(request: Request):
111
+ return request.state.db
112
+
113
+ ```
114
+ ```python
115
+ # database/database.py
116
+ from sqlalchemy import create_engine
117
+ from sqlalchemy.ext.declarative import declarative_base
118
+ from sqlalchemy.orm import sessionmaker
119
+
120
+ import json
121
+
122
+ with open('config.json', mode='r') as f:
123
+ config = json.load(f)
124
+ database_info = config['database']
125
+ DATABASE_URL = "mysql+pymysql://%s:%s@%s/%s?charset=utf8mb4" % (
126
+ database_info['user'],
127
+ database_info['password'],
128
+ database_info['host'],
129
+ database_info['db'],
130
+ )
131
+
132
+ engine = create_engine(DATABASE_URL, echo=False, pool_recycle=60)
133
+
134
+ SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
135
+
136
+ Base = declarative_base()
137
+ ```
138
+
139
+ ■ API実行用
140
+ テスト用に作ったもので実際はReactからaxiosで実行しています。
141
+ ```python
142
+ import subprocess
143
+
144
+
145
+ def main():
146
+ for i in range(0, 100):
147
+ print(f'{i+1}回目')
148
+ subprocess.call('curl http://localhost:8001/users', shell=True)
149
+
150
+
151
+ if __name__ == '__main__':
152
+ main()
153
+
154
+ ```
52
155
  ### 補足情報(FW/ツールのバージョンなど)
53
156
 
54
157
  ・python => 3.6