JsonDB
JsonDB — это основанная на формате JSON база данных в памяти. Она обладает следующими особенностями:
{'key1':1},{'key2':'value','pic':'value'},{'key3':'value'}
Следующие ключевые слова зарезервированы системой и не могут использоваться в качестве имени ключа в словаре dict.
$lt
$lte
$gt
$gte
$ne
$or
$or[0-9]
$jdb
$jdb_collections
$jdb_key
$jdb_hash
$jdb_coll
$jdb_hashSize
$jdb_md5
python setup.py install
pip install jsonDb
Многие операции используют условия фильтрации Filter. Например, удаление данных, обновление данных, запрос данных и т. д. С помощью фильтров мы можем указать, какие данные обновлять.
Фильтр jsonDb предоставляет относительно богатый и гибкий фильтр. Фильтр обычно используется в методе с параметром filter.
filter — это словарь, который включает key, value, логическое выражение и условие выражения.
filter={'логическое выражение':{key:{'условие выражения':value}}}
Логическое выражение: поддерживает два вида логики
'$or'
'$or1'
'$or2'
... Если существует несколько логических ИЛИ, необходимо использовать $or[0–9], например:filter={'$or':{'key1':value1, 'key2':value2,...}, '$or1':{'key1':value1, 'key2':value2,...}, ...}
filter={'key1':value1, 'key2':value2,...}
Условное выражение: условное выражение используется для представления отношения между ключом и значением
{<key>:<value>}
{<key>:{$lt:<value>}}
{<key>:{$lte:<value>}}
{<key>:{$gt:<value>}}
{<key>:{$gte:<value>}}
{<key>:{$ne:<value>}}
Фильтры поддерживают произвольное вложение, что делает их использование очень гибким. Например:
filter={'$or':{'key1':value1, '$or':{'key1':value1, '$or1':{'key1':value1, 'key2':value2,...},...},...},
'$or1':{'key1':value1, 'key2':value2,...}, ...}
Создайте экземпляр класса JSONDB, чтобы создать базу данных. Мы перегрузили метод str, поэтому можно напрямую просматривать статистическую информацию о базе данных с помощью print.
>>> from jsonDb.database import JSONDB
>>> myDb = JSONDB('USER_DB')
>>> print myDb
------ jdb statics ------
db_name: USER_DB
mem_collection: 0 bytes
mem_hash: 0 bytes
collection_num: 0
**** collection statics ****
jsonDB — это база данных в памяти, по сути, база данных — это класс экземпляра. Поэтому база данных удаляется и освобождается вместе с классом экземпляра. Вы можете удалить этот класс экземпляра с помощью del или позволить Python выполнить сборку мусора самостоятельно.
Вставьте одну или несколько записей данных, соответствующая коллекция будет создана автоматически. Необходимо организовать одну запись или несколько записей в виде списка. Одна запись должна быть в формате dict.
>>> myDb.insert('COL_CUSTOMERS',[{'id':1, 'name':'Jeffery', 'sex':'male', 'age':18, 'birth':'1990-01-03'}])
True
>>> print myDb
------ jdb statics ------
db_name: USER_DB
mem_collection: 104 bytes
mem_hash: 0 bytes
collection_num: 1
**** collection statics ****
name: COL_CUSTOMERS
data_num: 0
key: []
index: False
data_mem: 104 bytes
hash_mem: 0 bytes
>>>
Вы можете использовать find(), чтобы просмотреть результаты вставки, для удобства чтения JSONDB предоставляет статический метод форматированного вывода rprint():
>>> JSONDB.rprint(myDb.find('COL_CUSTOMERS'),indent=4)
[
{
"name": "Jeffery",
"age": 18,
"id": 1,
"birth": "1990-01-03",
"sex": "male"
}
]
>>>
Можно вставить несколько записей одновременно
>>> dataList = [{'id':2, 'name':'Jack', 'sex':'male', 'age':29, 'birth':'1990-01-03'},
... {'id':3, 'name':'Tom', 'age':18, 'birth':'1991-01-03'},
... {'id':4, 'name':'Wang', 'sex':'male', 'age':40, 'job':'software engineer'}]
>>> myDb.insert('COL_CUSTOMERS',dataList)
True
>>> JSONDB.rprint(myDb.find('COL_CUSTOMERS',filter={'id':{'$gte':2}}),indent=4)
[
{
"name": "Jack",
"age": 29,
"id": 2,
"birth": "1990-01-03",
"sex": "male"
},
{
"age": 18,
"id": 3,
"birth": "1991-01-03",
"name": "Tom"
},
{
"id": 4,
"job": "software engineer",
"age": 40,
"name": "Wang",
"sex": "male"
}
]
>>>
Здесь используется метод find() с условием запроса, запрашиваются только данные, где «id» больше или равен 2. Кроме того, формат каждой записи данных не должен быть одинаковым. Перевод текста запроса на русский язык:
Удаление данных
>>> JSONDB.rprint(myDb.find('COL_CUSTOMERS',filter={'id':1}),indent=4)
[
{
"name": "Jeffery",
"age": 18,
"id": 1,
"birth": "1990-01-03",
"sex": "male"
}
]
>>> myDb.delete('COL_CUSTOMERS', filter={'id': 1})
True
>>> JSONDB.rprint(myDb.find('COL_CUSTOMERS',filter={'id':1}), indent=4)
[]
>>>
Аналогично, мы можем использовать фильтр filter
для условного удаления нескольких записей, например, нам нужно удалить все записи, где атрибут age
больше 10 и меньше 30:
>>> JSONDB.rprint(myDb.find('COL_CUSTOMERS'), indent=4)
[
{
"name": "Jack",
"age": 29,
"id": 2,
"birth": "1990-01-03",
"sex": "male"
},
{
"age": 18,
"id": 3,
"birth": "1991-01-03",
"name": "Tom"
},
{
"id": 4,
"job": "software engineer",
"age": 40,
"name": "Wang",
"sex": "male"
},
{
"name": "Jeffery",
"age": 18,
"id": 1,
"birth": "1990-01-03",
"sex": "male"
}
]
>>> myDb.delete('COL_CUSTOMERS', filter={'age': {'$gt': 10, '$lt': 30}})
True
>>> JSONDB.rprint(myDb.find('COL_CUSTOMERS'), indent=4)
[
{
"id": 4,
"job": "software engineer",
"age": 40,
"name": "Wang",
"sex": "male"
}
]
>>>
Обновление данных
>>> JSONDB.rprint(myDb.find('COL_CUSTOMERS', filter={'name': 'Wang'}), indent=4)
[
{
"id": 4,
"job": "software engineer",
"age": 40,
"name": "Wang",
"sex": "male"
}
]
>>> myDb.update('COL_CUSTOMERS', set={'job': 'doctor'}, filter={'name': 'Wang'})
True
>>> JSONDB.rprint(myDb.find('COL_CUSTOMERS', filter={'name': 'Wang'}), indent=4)
[
{
"id": 4,
"job": "doctor",
"age": 40,
"name": "Wang",
"sex": "male"
}
]
>>>
Запрос данных
Запрос данных можно реализовать с помощью фильтра Filter
, чтобы обеспечить богатый функционал поиска.
>>> JSONDB.rprint(myDb.find('COL_CUSTOMERS'), indent=4)
[
{
"name": "Jeffery",
"age": 18,
"id": 1,
"birth": "1990-01-03",
"sex": "male"
},
{
"name": "Jack",
"age": 29,
"id": 2,
"birth": "1990-01-03",
"sex": "male"
},
{
"age": 18,
"id": 3,
"birth": "1991-01-03",
"name": "Tom"
},
{
"id": 4,
"job": "software engineer",
"age": 40,
"name": "Wang",
"sex": "male"
}
]
>>> JSONDB.rprint(myDb.find('COL_CUSTOMERS', filter={'$or': {'age': {'$gt': 20}, 'id': {'$gte': 3}}}, indent=4), indent=4)
[
{
"name": "Jack",
"age": 29,
"id": 2,
"birth": "1990-01-03",
"sex": "male"
},
{
"age": 18,
"id": 3,
"birth": "1991-01-03",
"name": "Tom"
},
{
"id": 4,
"job": "software engineer",
"age": 40,
"name": "Wang",
"sex": "male"
}
]
Если не указать коллекцию, то поиск будет производиться по всей базе данных. В настоящее время не поддерживается указание нескольких коллекций для поиска.
Можно использовать параметр limit
, чтобы ограничить количество возвращаемых записей. По умолчанию установлено значение 0, что означает возврат всех записей.
>>> JSONDB.rprint(myDb.find('COL_CUSTOMERS', filter={'$or': {'age': {'$gt': 20}, 'id': {'$gte': 3}}, limit=2}, indent=4))
[
{
"name": "Jack",
"age": 29,
"id": 2,
"birth": "1990-01-03",
"sex": "male"
},
{
"age": 18,
"id": 3,
"birth": "1991-01-03",
"name": "Tom"
}
]
В текущей версии не поддерживаются сортировка и указание возвращаемого набора полей. Поддержка будет добавлена в последующих версиях.
Указание ключа
Можно использовать ensureKey()
для указания ключа для коллекции. Этот ключ представляет собой список, который может быть кортежем ключей.
После указания ключа коллекция будет гарантировать уникальность значений ключа, то есть значения ключа в данных коллекции не будут повторяться.
Кроме того, после указания ключа автоматически создаётся хеш-таблица для этой коллекции и устанавливается индекс. При использовании find()
, если filter
строго указывает значение ключа, выполняется автоматический поиск по хешу, что значительно повышает эффективность поиска. Размер хеш-таблицы можно указать при создании базы данных с помощью параметра hashSize
, по умолчанию он равен 1000.
Следует отметить, что мы можем вызвать ensureKey()
, только когда в коллекции нет данных. Если данные уже были вставлены, а затем попытаться указать ключ, это приведёт к ошибке.
Слияние баз данных
С помощью merge()
можно объединить одну базу данных с другой. Слияние завершится ошибкой, если возникнут конфликты данных (например, конфликт значений ключей).
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )