pg_create_sequence_qgis_2x_version_2.py

R. R., 2017-03-12 06:09 AM

Download (1.75 KB)

 
1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3

    
4
# define Interface
5
##PostgreSQL/PostGIS administration (QGIS 2.x)=group
6
##Create sequence as default value=name
7
##Input_layer=vector
8
##Input_column=field Input_layer
9

    
10
from PyQt4.QtCore import *
11
from PyQt4.QtGui import *
12
from PyQt4 import *
13

    
14
from qgis.core import *
15
from qgis.gui import *
16
from qgis.utils import *
17

    
18
import psycopg2
19
import re
20

    
21
# get input parameters from GUI
22
inlayer = processing.getObject(Input_layer)
23
inlayer_dp = inlayer.dataProvider().dataSourceUri()
24

    
25
# get database parameters (input layer)
26
db_name = QgsDataSourceURI(inlayer_dp).database()
27
db_host = QgsDataSourceURI(inlayer_dp).host()
28
db_user = QgsDataSourceURI(inlayer_dp).username()
29
db_password = QgsDataSourceURI(inlayer_dp).password()
30

    
31
# get input layer parameters
32
inlayer_schema = QgsDataSourceURI(inlayer_dp).schema()
33
inlayer_table = QgsDataSourceURI(inlayer_dp).table()
34
inlayer_column = Input_column
35

    
36
# check input layer
37
provider = inlayer.dataProvider()
38
if provider.name() != 'postgres':
39
        raise RuntimeError('Input layer is not a PostGIS table.')
40

    
41
# connect to database
42
conn = psycopg2.connect( "dbname={0} host={1} user={2} password={3}".format( db_name, db_host, db_user, db_password ) )
43

    
44
# create and run query
45
with conn.cursor() as curs:
46
    sql = """CREATE SEQUENCE "{0}"."{1}_{2}_seq" OWNED BY "{0}"."{1}"."{2}";
47
    SELECT SETVAL('"{0}"."{1}_{2}_seq"', (SELECT MAX("{2}") FROM "{0}"."{1}"));
48
    ALTER TABLE "{0}"."{1}"
49
    ALTER COLUMN "{2}" SET DEFAULT nextval('"{0}"."{1}_{2}_seq"'::regclass);
50
    """.format ( inlayer_schema, inlayer_table, inlayer_column )
51
    
52
    curs.execute(sql)
53

    
54
    # commit changes if everything went OK
55
    conn.commit()
56

    
57
# reload input layer
58
inlayer.setDataSource( inlayer.source(), inlayer.name(), inlayer.providerType() )