-新增后台上传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"> <component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$/migrations/models/11_20250803092810_update.py" dialect="MySQL" /> <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$/migrations/models/16_20250806104900_update.py" dialect="GenericSQL" />
<file url="file://$PROJECT_DIR$/scripts/update_fr.py" dialect="MySQL" />
</component> </component>
</project> </project>

View File

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

View File

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

View File

@ -2,7 +2,7 @@ import asyncio
from pathlib import Path from pathlib import Path
import pandas as pd import pandas as pd
from tortoise import Tortoise from tortoise import Tortoise, connections
from tortoise.exceptions import MultipleObjectsReturned from tortoise.exceptions import MultipleObjectsReturned
from fastapi import UploadFile from fastapi import UploadFile
@ -95,7 +95,11 @@ async def import_def_fr(
async def main(): async def main():
await Tortoise.init(config=TORTOISE_ORM) 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_def_fr()
# await import_wordlist_fr() # await import_wordlist_fr()