从redis这样的关键值数据库获取和存储数据的简单方法。

DB-Transfer的Python项目详细描述


分贝传输

PyPI version

使用像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]

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java web爬虫:使用selenium+webdriver遍历页面链接时出现两种异常   java JPA和SYS_REFCURSOR-like OUT参数   非空参数的java方法引用?   xml中的java子节点名称   java为什么GC不在同一个方法中运行   java如何检查可执行JAR是否已在另一个JVM中完成   将外观更改为Nimbus后出现jtable Java错误   用户界面Java Swing架构问题?   java导入自定义字体时我做错了什么?   java如何用API制作可伸缩的游戏策划   java玩家和方块的碰撞和交集   java增强的for循环   java propertiesmavenplugin不适用于目标writeprojectproperties   java循环返回代码的开头   java使用分号执行apachecommonsexec多个命令   Wicket应用程序中的java全局可访问资源   java在eclipse中设置参数时可以使用类名而不是id吗?   eternal和maxElementsInMemory在ehcache中的java角色?   java ClassCastException在同一个ear中从两个不同的WAR加载同一个类时,由于类装入器不同