从redis这样的关键值数据库获取和存储数据的简单方法。
DB-Transfer的Python项目详细描述
分贝传输
使用像redis这样的关键值数据库操作数据的简单方法。
它旨在支持许多数据库,但目前支持redis和yaml文件。
安装
pip install DB-Transfer
设计
每个数据库都有一个适配器类。
在使用特定适配器名实例化python传输之后,我们可以操作
来自键值数据库的数据就像字典一样:`transfer[key]=value`
按键
密钥是使用前缀、名称空间和项创建的。
示例:data:users:arrrlo:full_name
(数据是前缀,用户是命名空间,arrlo:full_name是项)
redis适配器:
使用环境变量连接到redis
在码头集装箱中使用非常方便。
fromdb_transferimportTransfer,sent_envos.environ['REDIS_HOST']='localhost'os.environ['REDIS_PORT']='6379'os.environ['REDIS_DB']='0'@sent_env('redis','HOST','REDIS_HOST')@sent_env('redis','PORT','REDIS_PORT')@sent_env('redis','DB','REDIS_DB')classRedisTransfer(Transfer):def__init__(self,prefix=None,namespace=None):super().__init__(prefix=str(prefix),namespace=namespace,adapter_name='redis')
存储数据
rt=RedisTransfer()rt['my_key']='some_string'# redis: "SET" "data:my_key" "some_string"rt=RedisTransfer(namespace='my_namespace')rt['my_key']='some_string'# redis: "SET" "data:my_namespace:my_key" "some_string"rt=RedisTransfer(prefix='my_prefix',namespace='my_namespace')rt['my_key']='some_string'# redis: "SET" "my_prefix:my_namespace:my_key" "some_string"
使用类参数连接到redis
classRedisTransfer(Transfer):def__init__(self,prefix,namespace,host,port,db):super().__init__(prefix=str(prefix),namespace=namespace,adapter_name='redis')self.set_env('HOST',host)self.set_env('PORT',port)self.set_env('DB',db)
存储数据
rt=RedisTransfer(prefix='my_prefix',namespace='my_namespace',host='localhost',port=6379,db=0)rt['my_key']='some_string'# redis: "SET" "my_prefix:my_name_space:my_key" "some_string"
获取数据
rt=RedisTransfer(prefix='my_prefix',namespace='my_namespace',host='localhost',port=6379,db=0)my_var=rt['my_key']# redis: "GET" "my_prefix:my_namespace:my_key"
删除数据
rt=RedisTransfer(prefix='my_prefix',namespace='my_namespace',host='localhost',port=6379,db=0)delrt['my_key']# redis: "DEL" "my_prefix:my_namespace:my_key"
其他数据类型
rt=RedisTransfer(prefix='my_prefix',namespace='my_namespace',host='localhost',port=6379,db=0)rt['my_key_1']=[1,2,3,4]# redis: "RPUSH" "my_prefix:my_namespace:my_key_1" "1" "2" "3" "4"rt['my_key_2']={'foo','bar'}# redis: "SADD" "my_prefix:my_namespace:my_key_2" "foo" "bar"rt['my_key_3']={'foo':'bar'}# redis: "HMSET" "my_prefix:my_namespace:my_key_3" "foo" "bar"my_var_1=list(rt['my_key_1'])# redis: "LRANGE" "my_prefix:my_namespace:my_key_1" "0" "-1"my_var_2=set(rt['my_key_2'])# redis: "SMEMBERS" "my_prefix:my_namespace:my_key_2"my_var_3=dict(rt['my_key_2'])# redis: "HGETALL" "my_prefix:my_namespace:my_key_3"
redis散列数据类型
rt=RedisTransfer(prefix='my_prefix',namespace='my_namespace',host='localhost',port=6379,db=0)rt['my_key']={'foo':'bar'}# redis: "HMSET" "my_prefix:my_namespace:my_key" "foo" "bar"my_var=dict(rt['my_key'])# redis: "HGETALL" "my_prefix:my_namespace:my_key"my_var=rt['my_key']['foo']# redis: "HGET" "my_prefix:my_namespace:my_key" "foo"rt['my_key']['boo']='doo'# redis: "HSET" "my_prefix:my_namespace:my_key" "boo" "bar"
使用上下文管理器执行多个命令(仅用于set和delete)
withRedisTransfer(prefix='my_prefix',namespace='my_namespace',host='localhost',port=6379,db=0)asrt:rt['my_key_1']='some_string'rt['my_key_2']=[1,2,3,4]rt['my_key_3']={'foo':'bar'}# redis:## "MULTI"# "SET" "my_prefix:my_namespace:my_key_1" "some_string"# "RPUSH" "my_prefix:my_namespace:my_key_2" "1" "2" "3" "4"# "HMSET" "my_prefix:my_namespace:my_key_3" "foo" "bar"# "EXEC"
使用迭代器
rt=RedisTransfer(prefix='my_prefix',namespace='my_namespace',host='localhost',port=6379,db=0)forkey,valueiniter(rt):# yields key and value of every key starting with my_prefix:my_namespace:rt['my_key']={...}# saving a hash data (dict)forkey,valueiniter(rt['my_key']):# yields key and value for every HGET in my_prefix:my_namespace:my_key
按键
redis中的每个键都存储在同一个redis中的set中。
示例:
rt=RedisTransfer(prefix='my_prefix',namespace='my_namespace',host='localhost',port=6379,db=0)rt['key_1']='value'rt['key_2:key3']='value'rt['key_2:key4']='value'rt['key_2:key_5:key_6']='value'rt['key_2:key_5:key_7']='value'rt['key_2:key_5:key_8']='value'
因此,这些键是“key_1”、“key_2:key3”、“key_2:key4”、“key_2:key5:key_6”、“key_2:key5:key_7”、“key_2:key5:key_8”。
它们不是存储在一个集合中,而是存储在不同集合中的不同密钥:
'my_prefix:my_namespace':设置({'key_1','key_2:keys'})
'my_prefix:my_namespace:key_2':设置({'key_3','key_4','key_5:keys'})
“my_prefix:my_namespace:key_2:key_5”:设置({key_6',key_7',key_8'})
这样做可以方便地通过任意级别的键递归访问数据:
rt.keys()# > ['key_1', 'key_2:key3', 'key_2:key4', 'key_2:key_5:key_6', 'key_2:key_5:key_7', 'key_2:key_5:key_8']rt['key_2'].keys()# > ['key_3', 'key_4', 'key_5:key_6', 'key_5:key_7', 'key_5:key_8']rt['key_2:key_5'].keys()# > ['key_6', 'key_7', 'key_8']
现实生活中的例子
将所有数据从一个redis数据库传输到另一个数据库:
rt_1=RedisTransfer(prefix='my_prefix',namespace='my_namespace',host='localhost',port=6379,db=0)rt_2=RedisTransfer(prefix='my_prefix',namespace='my_namespace',host='some_host',port=6379,db=0)forkeyinrt_1.keys():rt_2[key]=rt_1[key]
或者如果要在一个批中插入数据(读取一个接一个):
withrt_2:forkeyinrt_1.keys():rt_2[key]=rt_1[key]
将数据从一个用户传输到另一个用户:
rt_1=RedisTransfer(prefix='my_prefix',namespace='my_namespace',host='localhost',port=6379,db=0)forkeyinrt_1['arrrlo'].keys():rt_1['edi:'+key]=rt_1['arrrlo:'+key]
从数据库中删除用户:
rt_1=RedisTransfer(prefix='my_prefix',namespace='my_namespace',host='localhost',port=6379,db=0)withrt_1:forkeyinrt_1['arrrlo'].keys():delrt_1['arrrlo:'+key]
yaml文件适配器:
最初,来自yaml文件的数据从文件传输到内存。
从那里,每次读、写或删除都会运行,直到sync()方法
被称为。然后将内存中的数据传输到yaml文件。
sync()方法可以使用上下文管理器调用,也可以手动调用。
使用环境变量定义yaml文件的路径
在码头集装箱中使用非常方便。
fromdb_transferimportTransfer,sent_envos.environ['YAML_FILE_PATH']='/path/to/yaml/file.yaml'@sent_env('yaml','FILE_LOCAL','YAML_FILE_PATH')classYamlFileTransfer(Transfer):def__init__(self,prefix=None,namespace=None):super().__init__(prefix=str(prefix),namespace=namespace,adapter_name='yaml')
使用类参数定义yaml文件的路径
classYamlFileTransfer(Transfer):def__init__(self,prefix,namespace,yaml_file_path):super().__init__(prefix=str(prefix),namespace=namespace,adapter_name='yaml')self.set_env('FILE_LOCAL',yaml_file_path)
写入和删除数据
可以使用上下文管理器或sync()方法写入数据。
yt=YamlFileTransfer(prefix='my_prefix',namespace='my_namespace',yaml_file_path='/path/')withyt:yt['my_key_1']='some_string'yt['my_key_2']='some_string'yt.sync()withyt:delyt['my_key_1']delyt['my_key_2']yt.sync()
现实生活中的例子
将用户数据从redis备份到yaml文件:
rt=RedisTransfer(prefix='my_prefix',namespace='my_namespace',host='localhost',port=6379,db=0)yt=YamlFileTransfer(prefix='my_prefix',namespace='my_namespace',yaml_file_path='/path/')forkeyinrt['arrrlo'].keys():yt['arrrlo:'+key]=rt['arrrlo:'+key]# or (depends on how you use prefix and namespace):rt=RedisTransfer(prefix='users',namespace='arrrlo',host='localhost',port=6379,db=0)yt=YamlFileTransfer(prefix='users',namespace='arrrlo',yaml_file_path='/path/')forkeyinrt.keys():yt[key]=rt[key]# or:rt=RedisTransfer(prefix='my_prefix:my_namespace',namespace='arrrlo',host='localhost',port=6379,db=0)yt=YamlFileTransfer(prefix='my_prefix:my_namespace',namespace='arrrlo',yaml_file_path='/path/')forkeyinrt.keys():yt[key]=rt[key]# or:rt=RedisTransfer(prefix='my_prefix',namespace='my_namespace',host='localhost',port=6379,db=0)yt=YamlFileTransfer(prefix='my_prefix:my_namespace',namespace='arrrlo',yaml_file_path='/path/')forkeyinrt.keys():yt[key]=rt['arrrlo:'+key]