postgresql 分区 partition by

按结构复制

CREATE TABLE testdb
(like testdb_old)
partition by range(vdate)

  

 

增加附属表

CREATE TABLE cbd_cbdmodeldetails_1_2 PARTITION OF cbd_cbdmodeldetails FOR VALUES FROM (1) TO (3);
CREATE TABLE cbd_cbdmodeldetails_3_6 PARTITION OF cbd_cbdmodeldetails FOR VALUES FROM (3) TO (7);

--顾头不顾尾

  

 

改变主键属性

1. 不存在列

-- auto-increment constraint for a new column
 ALTER TABLE public.products
    ADD COLUMN id SERIAL PRIMARY KEY;

  

2. 已存在列但是没数据

-- create sequence
CREATE SEQUENCE public_products_id_seq OWNED BY public.products.id;

-- use sequence for the target column
ALTER TABLE public.products ALTER COLUMN id SET DEFAULT nextval('public_products_id_seq');

  

3. 已经存在列并且已经有数据

-- create sequence
CREATE SEQUENCE public_products_id_seq OWNED BY public.products.id;

-- set the current value of the sequence to the max value from that column
-- (id column in this scenario)
SELECT SETVAL('public_products_id_seq', (select max(id) from public.products), false)

-- use sequence for the target column
ALTER TABLE public.products ALTER COLUMN id SET DEFAULT nextval('public_products_id_seq');

  

 

python:

from sqlalchemy import create_engine

odoo_conn = create_engine('postgresql://user:pswd@10.10.10.10:5432/dbname')


def createPartitionByName(tabname: str, interval: int):
    tmptab = tabname + '_2'
    renamesql = '''alter table %s rename to %s''' % (tabname, tmptab)
    createsql = '''create table %s (like %s) partition by range (id)''' % (tabname, tmptab)
    seqname = tabname + '_id_seq_1'
    ownid = tabname + '.id'
    createseq = '''CREATE SEQUENCE %s OWNED BY %s;''' % (seqname, ownid)
    altersql = '''ALTER TABLE %s ALTER COLUMN id SET DEFAULT nextval('%s');''' % (tabname, seqname)
    dropsql = '''drop table %s''' % tmptab
    for sql in [renamesql, createsql, createseq, altersql]:
        print('执行sql: ', sql)
        odoo_conn.execute(sql)
        print('执行完成')

    endnum = 0
    for i in range(20):
        startnum = endnum + 1
        endnum = startnum + interval
        createPartionTable(tabname, startnum, endnum)
    print('drop tbale')
    odoo_conn.execute(dropsql)


def createPartionTable(tabname, startnum, endnum):
    print(tabname, startnum, endnum)
    print('values from', startnum, 'to', endnum)
    sql = '''CREATE TABLE %s_%s_%s PARTITION OF %s FOR VALUES FROM (%s) TO (%s);''' % (tabname, startnum, endnum, tabname, startnum, endnum+1)
    odoo_conn.execute(sql)
    print('创建完成')

createPartitionByName('cbd_huilv', interval=1000000)

  

posted @ 2023-09-06 17:10  CrossPython  阅读(956)  评论(0编辑  收藏  举报