生成RDBMS的一致子集
rdbms-subsetter的Python项目详细描述
关系数据库管理系统子集图片::https://img.shields.io/pypi/v/rdbms subsetter.svg
:目标:https://pypi.python.org/pypi/rdbms subsetter
:alt:pypi status
……图片::https://circleci.com/gh/18f/rdbms-subsetter.svg?style=svg
:目标:https://circleci.com/gh/18f/rdbms subsetter
:alt:circleci status
…图片::https://api.codeculate.com/v1/badges/8fe62703d4999c07968c/可维护性
:目标:https://codeculate.com/github/18f/rdbms subsetter/可维护性
:alt:可维护性
。图片::https://api.codeculate.com/v1/badges/8fe62703d4999c07968c/test嫒coverage
:目标:https://codeculate.com/github/18f/rdbms subsetter/test嫒coverage
:alt:test coverage
。图片::https://gemnasium.com/badges/github.com/18f/rdbms subsetter.svg
:目标:https://gemnasium.com/github.com/18f/rdbms subsetter
:alt:gemnasium
定义后,所有父行
都将存在于子行中。
很适合从生产中创建测试/开发数据库。这很慢,
但是您需要多长时间生成一个测试/开发数据库?
用法:
rdbms subsetter<;source sqlalchemy connection string>;<;destination connection string>;<;要使用的行分数>;
示例::
子行将具有其外键所需的任何父行。它还将*尝试*包含属于每个父行的大多数子行(直到提供的`--children``参数,每个参数默认为3个),但它不能做出任何承诺。(要求所有子项会导致在
完全互连的数据库中无限传播,因为每个子记录都需要新的父记录,
需要新的子记录,需要新的父记录…
因此请谨慎地增加``--children`.)
表的变化很大(例如,数百到数十亿),
考虑使用`-l``标志,该标志通过对数公式设置行号目标
。
当设置`-l``时,如果``f``是指定的小数,
并且原始表有``n`行,
那么每个新表的行目标将是:
math.pow(10,math.log10(n)*f)
0.5的一小部分似乎会产生良好的结果,将10行转换为3行,
1000000到1000行,100000000到31622行是随机选择的,但是对于只有一个主键列的表,
可以使用
``force=<;tablename>;:<;primary key value>;``强制rdbms subsetter包含特定行(及其依赖项)。
这些行的子、孙等不受`--children``限制。
``rdbms subsetter``只执行插入;您的责任是首先设置目标数据库及其外键约束。最简单的方法是使用rdbms的dump实用程序。例如,对于postgresql,
::
dump--schema only-f schemadump.sql bigdb
createdb littledb
psql-f schemadump.sql littledb
默认情况下,行是从
数据库连接可见的架构中提取的。您还可以使用`--schema=<;name>;包含来自非默认模式
的行。``参数(可以多次使用)。
当前目标数据库必须在其自己的同名架构中包含相应的表(尚不支持在不同名称的架构之间移动)。
`--table`
(``-t``)和`--exclude table`(`-t```)参数(可以多次使用
)。这些参数采用通配符
(``*``)的表名或模式,并支持限定名(即``schema.table``)和简单的
名称。当同时给出`-t``和`-t``时,行为是只包括与至少一个`-t``开关匹配的表,而不包括`-t``开关。
对于具有复杂外键关系的复杂模式,子集提取可能会失败。要禁用写缓冲,将buffer参数设置为0::
rdbms subsetter postgresql://:@/bigdb postgresql://:@/littledb 0.05-b 0
例如,如果您使用mysql myisam
,并且无法定义约束,那么可以使用`--config``指定一个
配置文件。配置文件应该在json中指定约束
。例如,
{
"constraints":{
"(子表名)":[
{
"引用的架构":null,
"引用的表":"(父表名)",
"引用的列":["(父表中的约束列1)","(中的约束列2"父级)",],
"约束列":["(子级中的约束列1)","(子级中的约束列2)",],
}
],
},
"表":["schema1.table1","schema2.table2"],
"架构":["schema1","schema2"]
您可以限定"child-table-name",即
"schema-name.child-table-name"。还支持跨架构约束。
``rdbms subsetter``将这些约束视为实外键,并按上述方式获取父行和子行。
``tables``和``schemas``是可选的。
``tables``与传递的``--table``元素合并。在命令行上。
``schemas``与在命令行上传递的`--schema``元素合并。
并指定在调用类似于`--import=my.signals.signals_handlers``的脚本时模块
,那么当在db子设置过程中发送相应的信号时,您在模块中注册的任何信号处理程序都将被调用。
是否添加了"subsetter.signal\u row"`.
一个示例信号处理模块::
**kwargs):
print("添加的行用源db:{}调用,kwargs:{}"。format(源db,kwargs))
一个``subsetter.db``实例。
``kwargs``包含:
-``target-db```一个``subsetter.db``实例。
-``source-row```一个``sqlalchemy.engine.rowproxy``包含将插入行中的值。
-``target-table``一个``sqlalchemy.table`。
-``优先级排序的```:a``bool``表示是否应包括所有子行、孙子行等。
pip install psycopg2
*数据库。
(不是*源*数据库的大小!)
开发
:目标:https://pypi.python.org/pypi/rdbms subsetter
:alt:pypi status
……图片::https://circleci.com/gh/18f/rdbms-subsetter.svg?style=svg
:目标:https://circleci.com/gh/18f/rdbms subsetter
:alt:circleci status
…图片::https://api.codeculate.com/v1/badges/8fe62703d4999c07968c/可维护性
:目标:https://codeculate.com/github/18f/rdbms subsetter/可维护性
:alt:可维护性
。图片::https://api.codeculate.com/v1/badges/8fe62703d4999c07968c/test嫒coverage
:目标:https://codeculate.com/github/18f/rdbms subsetter/test嫒coverage
:alt:test coverage
。图片::https://gemnasium.com/badges/github.com/18f/rdbms subsetter.svg
:目标:https://gemnasium.com/github.com/18f/rdbms subsetter
:alt:gemnasium
定义后,所有父行
都将存在于子行中。
很适合从生产中创建测试/开发数据库。这很慢,
但是您需要多长时间生成一个测试/开发数据库?
用法:
rdbms subsetter<;source sqlalchemy connection string>;<;destination connection string>;<;要使用的行分数>;
示例::
子行将具有其外键所需的任何父行。它还将*尝试*包含属于每个父行的大多数子行(直到提供的`--children``参数,每个参数默认为3个),但它不能做出任何承诺。(要求所有子项会导致在
完全互连的数据库中无限传播,因为每个子记录都需要新的父记录,
需要新的子记录,需要新的父记录…
因此请谨慎地增加``--children`.)
表的变化很大(例如,数百到数十亿),
考虑使用`-l``标志,该标志通过对数公式设置行号目标
。
当设置`-l``时,如果``f``是指定的小数,
并且原始表有``n`行,
那么每个新表的行目标将是:
math.pow(10,math.log10(n)*f)
0.5的一小部分似乎会产生良好的结果,将10行转换为3行,
1000000到1000行,100000000到31622行是随机选择的,但是对于只有一个主键列的表,
可以使用
``force=<;tablename>;:<;primary key value>;``强制rdbms subsetter包含特定行(及其依赖项)。
这些行的子、孙等不受`--children``限制。
``rdbms subsetter``只执行插入;您的责任是首先设置目标数据库及其外键约束。最简单的方法是使用rdbms的dump实用程序。例如,对于postgresql,
::
createdb littledb
psql-f schemadump.sql littledb
默认情况下,行是从
数据库连接可见的架构中提取的。您还可以使用`--schema=<;name>;包含来自非默认模式
的行。``参数(可以多次使用)。
当前目标数据库必须在其自己的同名架构中包含相应的表(尚不支持在不同名称的架构之间移动)。
`--table`
(``-t``)和`--exclude table`(`-t```)参数(可以多次使用
)。这些参数采用通配符
(``*``)的表名或模式,并支持限定名(即``schema.table``)和简单的
名称。当同时给出`-t``和`-t``时,行为是只包括与至少一个`-t``开关匹配的表,而不包括`-t``开关。
对于具有复杂外键关系的复杂模式,子集提取可能会失败。要禁用写缓冲,将buffer参数设置为0::
rdbms subsetter postgresql://:@/bigdb postgresql://:@/littledb 0.05-b 0
例如,如果您使用mysql myisam
,并且无法定义约束,那么可以使用`--config``指定一个
配置文件。配置文件应该在json中指定约束
。例如,
{
"constraints":{
"(子表名)":[
{
"引用的架构":null,
"引用的表":"(父表名)",
"引用的列":["(父表中的约束列1)","(中的约束列2"父级)",],
"约束列":["(子级中的约束列1)","(子级中的约束列2)",],
}
],
},
"表":["schema1.table1","schema2.table2"],
"架构":["schema1","schema2"]
您可以限定"child-table-name",即
"schema-name.child-table-name"。还支持跨架构约束。
``rdbms subsetter``将这些约束视为实外键,并按上述方式获取父行和子行。
``tables``和``schemas``是可选的。
``tables``与传递的``--table``元素合并。在命令行上。
``schemas``与在命令行上传递的`--schema``元素合并。
并指定在调用类似于`--import=my.signals.signals_handlers``的脚本时模块
,那么当在db子设置过程中发送相应的信号时,您在模块中注册的任何信号处理程序都将被调用。
是否添加了"subsetter.signal\u row"`.
一个示例信号处理模块::
**kwargs):
print("添加的行用源db:{}调用,kwargs:{}"。format(源db,kwargs))
一个``subsetter.db``实例。
``kwargs``包含:
-``target-db```一个``subsetter.db``实例。
-``source-row```一个``sqlalchemy.engine.rowproxy``包含将插入行中的值。
-``target-table``一个``sqlalchemy.table`。
-``优先级排序的```:a``bool``表示是否应包括所有子行、孙子行等。
pip install psycopg2
*数据库。
(不是*源*数据库的大小!)
开发