#python #json
#python #json
Вопрос:
Я пытаюсь в основном использовать JSON в качестве базы данных для моего бота python discord, и я заметил, что когда я сохраняю свои новые изменения в базе данных, каждое другое свойство базы данных стирается (соответствует конкретному серверу, на котором я изменяю информацию), кроме того, который я меняю, я уверен, что это что-тоэто связано с тем, как я сохраняю переменную None, «», но в любом случае, это мой код:
role_nation = ""
role_mayor = ""
role_allied = ""
role_enemy = ""
role_foreigner = ""
nation_name = ""
servers = {}
@client.command()
async def setup(ctx, arg, role):
global role_nation
global role_mayor
global role_allied
global role_enemy
global role_foreigner
global nation_name
if arg == "nation":
role_nation = role
if arg == "allied":
role_allied = role
if arg == "mayor":
role_mayor = role
if arg == "enemy":
role_enemy = role
if arg == "foreigner":
role_foreigner = role
if arg == "set_nation":
nation_name = role
roles = {"nation_name": nation_name,
"nation": role_nation,
"allied": role_allied,
"mayor": role_mayor,
"enemy": role_enemy,
"foreigner": role_foreigner}
servers[ctx.guild.id]= roles
await ctx.send("Successfully saved your preferences.")
await ctx.send(str(servers))
with open('servers.json', 'w') as fp:
json.dump(servers, fp)
fp.close()
role_nation = ""
role_mayor = ""
role_allied = ""
role_enemy = ""
role_foreigner = ""
nation_name = ""
Комментарии:
1. Почему вы явно устанавливаете каждое значение
""
в конце функции?2. @chepner Совсем забыл, был частью какого-то отладочного материала. 1
Ответ №1:
Когда вы помещаете объект в файл json, он перезаписывает весь файл тем, что было сброшено. Это ожидаемое поведение. Что вам нужно сделать, так это при первом запуске сервера вам нужно загрузить предыдущий файл json, который у вас есть, в память и перезаписать вашу servers
переменную. После этого данные находятся в памяти, поэтому вы можете добавлять, удалять или обновлять их, а затем, когда вам нужно снова сохранить их в файл, затем сбросить.
json не имеет встроенных функций базы данных, таких как индексация, транзакции или обновление отдельных объектов. Он просто преобразует объект в строку, чтобы вы могли поместить эту строку в файл и перезаписать этот файл.
Ответ №2:
Забыл, что в конце функции я сбрасывал каждую переменную, спасибо @chepner