自动生成SQL脚本文件,自动针对docker运行容器形式的PG数据库进行数据模拟插入。可以以此为基础进行脚本改造,达到模拟大数据的用途。源码的写法比较土,后面有空可以优化一下代码。
python文件名:init_db.py
#!/usr/bin/python
#create time: 2022/03/12 by epic
import os;
def get_db_container_id():
print('*** get_db_container_id');
docker_ps = os.popen('docker ps|grep postgres').readlines();
container_info = docker_ps[0].split();
return container_info[0];
def generate_sql_script_file(sql_script_file, number):
os.system('rm -f ' + sql_script_file);
os.system('touch ' + sql_script_file);
for i in range(number):
sno = str(i + 1) + '';
sname = 'stu' + sno;
sex = 1;
os.system("echo delete from student where sno=\\'" + sno + "\\'\\; >> " + sql_script_file);
os.system("echo insert into student values\\(\\'" + sno +"\\',\\'"+sname+"\\',"+str(sex)+"\\)\\; >> " + sql_script_file);
return;
def copy_script_file_to_container(src_script_file,
dest_script_file,
container_id):
print('*** copy_script_file_to_container: ' + src_script_file + ',' + dest_script_file + ',' + container_id);
return os.system('docker cp ' + src_script_file + ' ' + container_id + ':' + dest_script_file);
#
#chown postgres:postgres /media/init_db_script.sql
#su - postgres -c "psql -d db1 -f /media/init_db_script.sql"
#
def generate_host_init_db_shell(host_init_db_shell,
container_init_db_shell,
container_init_db_script):
print('*** generate_host_init_db_shell: ' + host_init_db_shell + ',' + container_init_db_shell + ',' + container_init_db_script);
os.system('mv ' + host_init_db_shell + ' ' + host_init_db_shell + '.bak');
os.system('touch ' + host_init_db_shell);
os.system('echo chown postgres:postgres ' + container_init_db_shell + '>> ' + host_init_db_shell);
os.system('echo chown postgres:postgres ' + container_init_db_script + '>> ' + host_init_db_shell);
os.system('echo su - postgres -c \\"psql -d db1 -f ' + container_init_db_script + '\\" >> ' + host_init_db_shell);
return;
#
#docker exec -it 1deab09a9907 /bin/sh -c 'sh /media/init_db.sh'
#
def exec_script_file(container_id,
container_init_db_shell):
print('*** exec_script_file: ' + container_id + ',' + container_init_db_shell);
os.system('docker exec -it ' + container_id + " /bin/sh -c ' sh " + container_init_db_shell + "'");
return;
def main():
print("^*********************--------------------***********************^");
container_id = get_db_container_id();
host_init_db_shell = "/root/init_db.sh";
host_init_db_script = "/root/init_db_script.sql";
container_init_db_shell = "/media/init_db.sh";
container_init_db_script = "/media/init_db_script.sql";
number = 2;
generate_host_init_db_shell(host_init_db_shell, container_init_db_shell, container_init_db_script);
copy_script_file_to_container(host_init_db_shell, container_init_db_shell, container_id);
generate_sql_script_file(host_init_db_script, number);
copy_script_file_to_container(host_init_db_script, container_init_db_script, container_id);
exec_script_file(container_id, container_init_db_shell);
print(">>>>>>insert number: " + str(number));
print("^*********************--------------------***********************^");
return;
main();
运行python脚本文件进行数据模拟,最后打印了模拟了多少条数据:
[root@localhost ~]# ./init_db.py
^*********************--------------------***********************^
*** get_db_container_id
*** generate_host_init_db_shell: /root/init_db.sh,/media/init_db.sh,/media/init_db_script.sql
*** copy_script_file_to_container: /root/init_db.sh,/media/init_db.sh,6825fcf46076
*** copy_script_file_to_container: /root/init_db_script.sql,/media/init_db_script.sql,6825fcf46076
*** exec_script_file: 6825fcf46076,/media/init_db.sh
DELETE 0
INSERT 0 1
DELETE 0
INSERT 0 1
>>>>>>insert number: 2
^*********************--------------------***********************^
-----------
运行python脚本后生成SQL脚本文件和shell脚本文件,并且自动拷贝到指定的容器中,接着自动在容器中执行SQL文件。下面2个文件是生成的中间文件:
文件1:生成shell脚本文件init_db.sh内容为:
chown postgres:postgres /media/init_db.sh
chown postgres:postgres /media/init_db_script.sql
su - postgres -c "psql -d db1 -f /media/init_db_script.sql"
文件2:生成的SQL文件init_db_script.sql内容为:
[root@localhost ~]# cat init_db_script.sql
delete from student where sno='1';
insert into student values('1','stu1',1);
delete from student where sno='2';
insert into student values('2','stu2',1);
[root@localhost ~]# docker exec -it 6825fcf46076 /bin/sh
# su - postgres
postgres@6825fcf46076:~$ psql
psql (10.17 (Debian 10.17-1.pgdg90+1))
Type "help" for help.
postgres=# \c db1
You are now connected to database "db1" as user "postgres".
db1=# truncate student;
TRUNCATE TABLE
db1=# select * from student;
sno | sname | sex
-----+-------+-----
1 | stu1 | 1
2 | stu2 | 1
(2 rows)