Sly32

Рейтинг
389
Регистрация
29.03.2012
Должность
Software engineer

В твоем случае человечество ничего не потеряет если пропадет такой гег=ниальный сайт из то-50 по версии журнала работница и крестьянка. 😀

В плане бэкапа вполне можно хранить на твердотельном, если твой шкаф постоянно подвергается опасности урониться. Надежность SSD измеряется в циклах чтения записи и в режиме бэкапа тебе его хватит на десятки лет. 

Если ты имеешь ввиду буфферизацию, то достаточно увеличить размер буфера, но не более 40% от всей. Если ты хочешь вообще работать с базой в памяти , то дорога в noSQL. Например MongoDB
webinfo #:

Указывать родительский пункт.

Но потом еще обрабатывать ответ. С утра набросал сравнительный профайлер по времени и простенький код

import os
import time
import json
import functools
from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker


def profiler(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()  # Start the timer
        result = func(*args, **kwargs)  # Execute the function
        end_time = time.time()  # End the timer
        execution_time = end_time - start_time  # Calculate the execution time
        print(f"Execution time for {func.__name__}: {execution_time:.4f} seconds")
        return result  # Return the function result
    return wrapper


@profiler
def get_language_db():
    connector = "postgresql+psycopg2://postgres:postgres@localhost:5432/simple_db"
    engine = create_engine(
        connector,
        connect_args={"options": "-c timezone=utc", "connect_timeout": 30},
    )
    Session = sessionmaker(bind=engine, expire_on_commit=False)
    session = Session()
    try:
        result = session.execute(text("SELECT * FROM menu"))
        return result.fetchall()  # Fetch all the results
    finally:
        session.close()



@profiler
def get_language_from_file(lang: str = "en") -> dict:
    file_name = "lang_settings.json"
    file_path = "".join((os.getcwd(), "/settings/", file_name))
    with open(file_path, "r") as f:
        data = json.load(f)
        lang = data.get(lang)
        if not lang:
            return data.get("en")
        return lang


if __name__=="__main__":
    print(get_language_from_file())
    print(get_language_db())

И вот результат без кэширования работы с базой:

Файл:

Execution time for get_language: 0.0002 seconds

{'subjects': {'subjects': {'chemistry': 'chemistry', 'math': 'mathematics'}}, 'mentors': 'mentors', 'scheduler': 'scheduler', 'news': 'news', 'adverts': 'adverts'}

База:

Execution time for get_language_db: 0.1151 seconds

[('en        ', 'mentee    ', 'mentee    '), ('en        ', 'mentor    ', 'mentor    '), ('en        ', 'news      ', 'news      '), ('en        ', 'advert    ', 'advert    '), ('en        ', 'schedule  ', 'schedule  '), ('en        ', 'schedule  ', 'schedule  '), ('en        ', 'schedule  ', 'schedule  '), ('en        ', 'schedule  ', 'schedule  '), ('en        ', 'schedule  ', 'schedule  ')]

Обратите внимание,  в каком виде ответ. Из файла я сразу получаю удобоваримый json, который могу отдавать в шаблонизатор.
Из базы мне еше нужно написать обработчик, который сконвертит список в json.

FuRReX #:
На DLE достаточно просто.

Натыкать кнопок?? Создать 2 шаблона и два языковых файла? Это вообще не SOLID 😀

webinfo #:

Это делается не так. Нужно делать таблицу, где каждая строка соответствует конкретному пункту меню.

Вариант 2. А как хранить  меню второго уровня?

webinfo #:

Выше у тебя таблица какая-то кривая, поэтому и проблемы с расширением.

Я и написал: выбор варианта - в зависимости от конкретики проекта. Например, одно дело 2 языка, другое дело - 20 языков. И т.п.

Это пример таблицы, где имя колонки- ключ а строка- перевод. Плюсы- запрос отдает всего одну строку данных, по факту индекс не нужен для таблицы. Вариант- одна таблица где три колонки, язык, ключ значение. Легко добавлять новые поля, но будет селектится несколько строк, которые нужно преобразовать  в формать удобный для шаблонизатора. Лишний код. Ну и плюс расширение до нескольких уровней вложенности усложняет задачу сразу

Ну и третий вариант, несколько таблиц, мне совсем не нравится

webinfo #:
1) Создать в таблице меню колонки с языковыми вариантами.

Невозможность расширения, выше уже писал.

webinfo #:
2) Создать дополнительные таблицы с языковыми вариантами.

необходимоссть  джойнить таблицы - сложный запрос для простой задачи - неоправданный расход ресурсов и время.

Спасибо, твой вариант я рассматривал имеет место быть

Vistaa #:

Ну есть сайт о животних, или вас интересует именно водний мир? 

такой простой вопрос а ты хочешь разьяснений...

webinfo #:

Да там 100500 способов реализации. Выбор конкретного способа зависит от конкретного проекта. И да, в файлах тоже хранят, но нет так, как у тебя, а переводы фраз.

Я не требую за меня решать. Знаю что вариантов множество. Мне интересно, как бы ты решал эту проблему. Не привязывайся к проекту, исходи из задачи. Для сайта - окей, приведи как бы ты делал многоязычное меню для сайта.

WebStorm #:
тогда я приношу извинения, реализация нормальная

Спасибо за интересную дискуссию

estic #:
В итоге получается ваш вариант 1.

все верно, и свои консерны к этому способу я уже высказывал, но да - он самый быстрый

WebStorm #:
я не знаком с pyton, но Fastapi кэширует в итоге этот  "малюсенький объект" в каком виде? снова в json?, если да, то всё равно он его будет снова и снова парсить

Нет, я думал ты знаком с питон. Приведенный код один раз обращается к файлу, получает нужные данные по ключу. Потом json  конвертируется в питоновский обьект типа "словарь"(dict), если не ошибаюсь, это аналог пхпэшного array, и уже в байткоде путешествует дальше. То есть ничего не разрастется. добавлю в json строку иеню - скомпилируется и буде использована. При этом мне не надо лезть руками в код-файлы, все можно реализовать через пользовательский интерфейс

Всего: 8125