[Python] Concatenazione lato DB => Rebus

Daniele Varrazzo piro a develer.com
Mer 21 Mar 2012 16:35:35 CET


On Wed, 21 Mar 2012 16:09:21 +0100, Simone Federici wrote:

> cmq tornando al problema che è tuttaltro che risolto,
> ci sono le FK che sono nullable :-)
> quindi il problema mi si ripresenta da dietro l'angolo
>
> CREATE TABLE sample_chapter
> (
>   b_name character varying(100) NOT NULL,
>   b_author character varying(100),

Dipende da cosa definisci per "chiave". Io ho definito una mia tabella 
così:

create table other (
   id serial primary key,
   name varchar(100),
   author varchar(100),
   constraint fkey_book foreign key (name, author)
     references book (name, author));

prova ad inserire un solo record ('a', 'b') nella tua tabella book, e 
poi:

     test=> insert into other (name, author) values ('a', 'b');
     INSERT 0 1

fino a qui tutto bene.

     test=> insert into other (name, author) values ('c', 'd');
     ERROR:  insert or update on table "other" violates foreign key 
constraint "fkey_book"

fino a qui tutto bene.

     insert into other (name, author) values ('c', null);

e ora che dovrebbe fare il db? 'c' non esiste, ma ('c', null) non può 
esistere. Ma c'è il null: questo porta il record al di fuori del 
dominio, quindi non c'è alcun tentativo di rinforzare la chiave. Così, 
forse sorprendentemente, forse no, questo insert funziona.

     INSERT 0 1

Il problema è quello che ti ho detto nella prima riga della prima 
risposta: ('c', null) non è una chiave. Sono solo due valori buttati in 
due campi.

Detto questo, il problema di serializzare una coppia generica non è 
difficile. Giusto per darti più corda con la quale impiccarti...

test=> create table pairs (a text, b text);
CREATE TABLE
test=> insert into pairs values ('a', 'b');
INSERT 0 1
test=> insert into pairs values ('a', '');
INSERT 0 1
test=> insert into pairs values ('a', null);
INSERT 0 1
test=> select coalesce(quote_literal(a), '') || '_' || 
coalesce(quote_literal(b), '') from pairs;
  ?column?
----------
  'a'_'b'
  'a'_''
  'a'_
(3 rows)

Solo, non dire che sono fkey: sono la serializzazione di due valori 
generici.

-- 
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com


Maggiori informazioni sulla lista Python