以小批量运行大型 PostgreSQL UPDATE 和 DELETE 查询以防止锁定
项目描述
PostgreSQL 相当于https://github.com/gabfl/mysql-batch。
在 PostgreSQL 中更新或删除大量行将创建锁,从而使其他并行运行的查询瘫痪。
此工具将小批量运行 UPDATE 和 DELETE 查询以限制锁定。如果需要更新或删除大量行,也可以限制一次选择的行数。
安装
pip3 install pg_batch
更新示例
您可以使用sample_table/schema.sql中可用的模式运行此示例
以下示例将与以下更新相同:
UPDATE batch_test SET date = NOW() WHERE number > 30 AND date is NULL;
这相当于以 20 行的批次处理此更新:
pg_batch --host localhost \
--user postgres \
--password secret_password \
--database "test" \
--table "batch_test" \
--write_batch_size 20 \
--where "number > 30 AND date IS NULL" \
--set "date = NOW()"
输出样本:
* Selecting data...
query: SELECT id as id FROM batch_test WHERE number > 30 AND date IS NULL AND id > 0 ORDER BY id LIMIT 10000
* Preparing to modify 70 rows...
* Updating 20 rows...
query: UPDATE batch_test SET date = NOW() WHERE id IN (31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50)
* Start updating? [Y/n]
* Updating 20 rows...
query: UPDATE batch_test SET date = NOW() WHERE id IN (51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70)
* Updating 20 rows...
query: UPDATE batch_test SET date = NOW() WHERE id IN (71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90)
* Updating 10 rows...
query: UPDATE batch_test SET date = NOW() WHERE id IN (91, 92, 93, 94, 95, 96, 97, 98, 99, 100)
* Selecting data...
query: SELECT id as id FROM batch_test WHERE number > 30 AND date IS NULL AND id > 100 ORDER BY id LIMIT 10000
* No more rows to modify!
* Program exited
删除示例
以下示例将与以下删除相同:
DELETE FROM batch_test WHERE number > 30 AND date is NULL;
这相当于以 20 行的批次处理此删除:
pg_batch --host localhost \
--user postgres \
--password secret_password \
--database "test" \
--table "batch_test" \
--write_batch_size 20 \
--where "number > 30 AND date IS NULL" \
--action "delete"
输出样本:
* Selecting data...
query: SELECT id as id FROM batch_test WHERE number > 30 AND date IS NULL AND id > 0 ORDER BY id LIMIT 10000
* Preparing to modify 70 rows...
* Deleting 20 rows...
query: DELETE FROM batch_test WHERE id IN (31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50)
* Start deleting? [Y/n]
* Deleting 20 rows...
query: DELETE FROM batch_test WHERE id IN (51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70)
* Deleting 20 rows...
query: DELETE FROM batch_test WHERE id IN (71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90)
* Deleting 10 rows...
query: DELETE FROM batch_test WHERE id IN (91, 92, 93, 94, 95, 96, 97, 98, 99, 100)
* Selecting data...
query: SELECT id as id FROM batch_test WHERE number > 30 AND date IS NULL AND id > 100 ORDER BY id LIMIT 10000
* No more rows to modify!
* Program exited
用法
usage: pg_batch [-h] [-H HOST] [-P PORT] -U USER [-p PASSWORD] -d DATABASE -t
TABLE [-id PRIMARY_KEY] -w WHERE [-s SET]
[-rbz READ_BATCH_SIZE] [-wbz WRITE_BATCH_SIZE] [-S SLEEP]
[-a {update,delete}] [-n]
optional arguments:
-h, --help show this help message and exit
-H HOST, --host HOST PostgreSQL server host
-P PORT, --port PORT PostgreSQL server port
-U USER, --user USER PostgreSQL user
-p PASSWORD, --password PASSWORD
PostgreSQL password
-d DATABASE, --database DATABASE
PostgreSQL database name
-t TABLE, --table TABLE
PostgreSQL table
-id PRIMARY_KEY, --primary_key PRIMARY_KEY
Name of the primary key column
-w WHERE, --where WHERE
Select WHERE clause
-s SET, --set SET Update SET clause
-rbz READ_BATCH_SIZE, --read_batch_size READ_BATCH_SIZE
Select batch size
-wbz WRITE_BATCH_SIZE, --write_batch_size WRITE_BATCH_SIZE
Update/delete batch size
-S SLEEP, --sleep SLEEP
Sleep after each batch
-a {update,delete}, --action {update,delete}
Action ('update' or 'delete')
-n, --no_confirm Don't ask for confirmation before to run the write
queries
执照
该程序受 MIT 许可(查看许可)。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
源分布
pg_batch-1.1.1.tar.gz
(7.1 kB
查看哈希)
内置分布
pg_batch-1.1.1-py2.py3-none-any.whl
(7.3 kB
查看哈希)