質問編集履歴
2
記入漏れの修正
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
最小構成にて「試したこと」追記
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
|