-新增后台上传xlsx表格接口进行批量数据库更新
This commit is contained in:
Miyamizu-MitsuhaSang 2025-08-21 09:50:30 +08:00
parent ff98203cc0
commit bc517de913
5 changed files with 14 additions and 12 deletions

View File

@ -3,5 +3,6 @@
<component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$/migrations/models/11_20250803092810_update.py" dialect="MySQL" />
<file url="file://$PROJECT_DIR$/migrations/models/16_20250806104900_update.py" dialect="GenericSQL" />
<file url="file://$PROJECT_DIR$/scripts/update_fr.py" dialect="MySQL" />
</component>
</project>

View File

@ -2,13 +2,12 @@ import tempfile
from pathlib import Path
from fastapi import Depends, HTTPException, Request, Query, UploadFile, File
from typing import Literal, Tuple, Union
from typing import Literal, Tuple
from tortoise.exceptions import DoesNotExist
from tortoise.transactions import in_transaction
from app.models.base import User
from app.models.fr import DefinitionFr
from app.utils.security import is_admin_user
from app.api.admin.router import admin_router
import app.models.fr as fr
@ -29,10 +28,9 @@ async def get_wordlist(request: Request,
:param page: 显示的表格视窗的页数起始默认为 1
:param page_size: 控制每页的单词内容条数
:param lang_code: 查询并显示对应语言的单词表
:param admin_user: 管理员权限校验自动完成
:return: None
"""
if not admin_user[0].is_admin:
raise HTTPException(status_code=403, detail="非管理员,无权限访问")
offset = (page - 1) * page_size
if lang_code == "fr":
total = await fr.DefinitionFr.all().count()
@ -201,8 +199,8 @@ async def add_dict(
)
if not created:
raise HTTPException(status_code=409, detail="释义已存在")
else:
raise HTTPException(status_code=400, detail="暂不支持语言类型")
else:
raise HTTPException(status_code=400, detail="暂不支持语言类型")
@admin_router.post("/dict/update_by_xlsx", deprecated=False)
@ -229,5 +227,6 @@ async def update_by_xlsx(
await import_def_fr(path=tmp_path)
except Exception as e:
raise HTTPException(status_code=500, detail=f"导入失败:{str(e)}")
#TODO: 导入失败后的回滚(删除本次已经添加的内容)
return {"message": "导入成功"}

View File

@ -7,9 +7,7 @@ dict_search = APIRouter()
@dict_search.get("/search")
async def search(
request: Request, lang_pref: str, query_word: str, user=Depends(get_current_user)
):
async def search(request: Request, lang_pref: str, query_word: str, user= Depends(get_current_user)):
word_content = await DefinitionFr.filter(
word__icontains=query_word, lang_pref=lang_pref
).values("word", "part_of_speech", "meaning", "example")

View File

@ -2,7 +2,7 @@ import asyncio
from pathlib import Path
import pandas as pd
from tortoise import Tortoise
from tortoise import Tortoise, connections
from tortoise.exceptions import MultipleObjectsReturned
from fastapi import UploadFile
@ -95,7 +95,11 @@ async def import_def_fr(
async def main():
await Tortoise.init(config=TORTOISE_ORM)
await DefinitionFr.all().delete()
await DefinitionFr.all().delete() # TRUNCATE TABLE definitions_fr;
conn = connections.get("default")
await conn.execute_script("""
ALTER TABLE definitions_fr AUTO_INCREMENT = 1;
""")
await import_def_fr()
# await import_wordlist_fr()