我正在使用python脚本创建模式“schema1”的after_insert触发函数,以在名为“live”的模式中INSERT或UPDATE数据(取决于“live”中是否存在该对象)。我的问题是,我的代码我还使用NULL值INSERT或UPDATE值。例如:
INSERT INTO live.table1 (column1,coulmn2,column3) VALUES ('a',NULL,'b');
在其中一些列中,我在模式“实时”中有DEFAULT值,如果我从此触发器函数中为其分配NULL,则不会触发该值。如何动态地从INSERT / UPDATE语句中排除这些列?
我有以下代码:
# get all the columns and make set_values and insert_value strings
set_values=''
insert_values=''
#if( execute ):
command= '''
SELECT column_name FROM information_schema.columns WHERE table_name='{table}' and table_schema='{schema}';
'''.format( table=table1, schema=schema1 )
# do SQL
cur.execute( command )
columns=cur.fetchall()
for i, column in enumerate(columns):
if i:
set_values+=", "
if column[0]=='temp_info':
set_values+=column[0]+"=NULL::text"
else:
set_values+=column[0]+"=NEW."+column[0]
insert_values="( "
for i, column in enumerate(columns):
if i:
insert_values+=", "
insert_values+=column[0]
insert_values+=" ) VALUES( "
for i, column in enumerate(columns):
if i:
insert_values+=", "
if( column[0]=='temp_info' ):
insert_values+="NULL::text"
else:
insert_values+="NEW."+column[0]
insert_values+=" )"
###############
# make the triggerfunctions now
###############
command= '''
CREATE OR REPLACE FUNCTION {schema}.{table}_after_insert() RETURNS trigger AS $BODY$
BEGIN
IF( SELECT TRUE FROM {schema_live}.{table} WHERE {live_table_id} = NEW.{live_table_id} ) THEN
UPDATE {schema_live}.{table} SET {set_values}
WHERE NEW.{live_table_id} = {live_table_id};
RAISE NOTICE 'Can update row in {schema_live}.{table}';
ELSE
INSERT INTO {schema_live}.{table} {insert_values};
RAISE NOTICE 'Can insert row in {schema_live}.{table}';
END IF;
RETURN NEW;
END; $BODY$
LANGUAGE plpgsql;
'''.format( schema_live=S_LIVE, schema=schema1, table=table1, live_table_id=ids[table1], table_id=id, set_values=set_values )