I have a case where SA 0.3.8 create wrong SQL code and an unneeded and unwanted
INSERT statement. My code inserts a new Arbeitsmittel into the DB using:

   Arbeitsmittel = wrapper.getMapper('arbeitsmittel')

   d = {'hidx' : hidx,
        'zodb_path' : zodb_path,
        'versionsnr' : 0,
        'dateiname' : AM.dateiname.replace(AM.hidx, hidx),
        'neudat' : datetime.datetime.now(),
        'benutzer' : getSecurityManager().getUser().getUserName().lower(),
        'status' : 4,
        'idzielgruppe' : 0,
       }

   AM_new = Arbeitsmittel(**d)
   session.save(AM_new)


The 'Arbeitsmittel' mapper is defined against a select():


   ######################################################################
   # Arbeitsmittel
   ######################################################################

   FassungTable = Table('fassung', metadata, autoload=True)
   StatusTable = Table('status', metadata, autoload=True)
   SachgebietTable = Table('sachgebiet', metadata, autoload=True)
   ZielGruppenTable = Table('zielgruppen', metadata, autoload=True)
   ArbeitsmittelTable = Table('arbeitsmittel', metadata, autoload=True)

   s = select([ArbeitsmittelTable,
func.to_char(ArbeitsmittelTable.c.gesperrt_bis, 'DD.MM.YYYY').label('gesperrt_bis_string'), func.to_char(ArbeitsmittelTable.c.stand, 'DD.MM.YYYY').label('stand_string'), func.to_char(ArbeitsmittelTable.c.aedat, 'DD.MM.YYYY').label('aedat_string'), func.to_char(ArbeitsmittelTable.c.neudat, 'DD.MM.YYYY').label('neudat_string'), func.to_char(ArbeitsmittelTable.c.rechner_stand, 'DD.MM.YYYY').label('rechnerstand_string'), func.to_char(ArbeitsmittelTable.c.stand, 'YYYY-MM-DD').label('stand_string_us'), func.to_char(ArbeitsmittelTable.c.aedat, 'YYYY-MM-DD').label('aedat_string_us'), func.to_char(ArbeitsmittelTable.c.neudat, 'YYYY-MM-DD').label('neudat_string_us'), func.to_char(ArbeitsmittelTable.c.chgdat, 'YYYY-MM-DD').label('chgdat_string_us'),
               GattungTable.c.bezeichnung.label('gattung_bezeichnung'),
               GattungTable.c.gattung.label('gattung_gattung'),
               GattungTable.c.dtd.label('gattung_dtd'),
               GattungTable.c.typ.label('gattung_typ'),

GattungTable.c.template_dateiname.label('gattung_template_dateiname'),

GattungTable.c.template_bezeichnung.label('gattung_template_bezeichnung'),
               GattungTable.c.dtd_kuerzel,
               GattungTable.c.dtd_bezeichnung,
               GattungTable.c.dtd_version,
               GattungTable.c.dtd_identifier,
               ZielGruppenTable.c.id.label('zielgruppen_id'),

ZielGruppenTable.c.bezeichnung.label('zielgruppen_bezeichnung'),
               FassungTable.c.bezeichnung.label('fassung_bezeichnung'),

SachgebietTable.c.bezeichnung.label('sachgebiet_bezeichnung'),
               StatusTable.c.bezeichnung.label('status_bezeichnung'),
              ],
              and_(ArbeitsmittelTable.c.idgattung==GattungTable.c.id,
                   ArbeitsmittelTable.c.idsachgebiet==SachgebietTable.c.id,
                   ArbeitsmittelTable.c.status==StatusTable.c.status,

ArbeitsmittelTable.c.idzielgruppe==ZielGruppenTable.c.id,
              )).alias('arbeitsmittel_select')


   class Arbeitsmittel(object): pass
   mapper(Arbeitsmittel, s)



When generating the new instance above the following code SQL code is executed:


2007-07-02 12:02:07,836 INFO sqlalchemy.orm.unitofwork.UOWTransaction.0x..94 Task dump:

UOWTask(-0x511aef94, Arbeitsmittel/arbeitsmittel_select/None) (save/update phase)
  |- Save [EMAIL PROTECTED]
  |----


2007-07-02 12:02:07,837 INFO sqlalchemy.engine.base.Engine.0x..74 BEGIN
2007-07-02 12:02:07,850 INFO sqlalchemy.engine.base.Engine.0x..74 select nextval('"arbeitsmittel_id_key"'::text)
2007-07-02 12:02:07,850 INFO sqlalchemy.engine.base.Engine.0x..74 None
2007-07-02 12:02:07,854 INFO sqlalchemy.engine.base.Engine.0x..74 INSERT INTO arbeitsmittel (id, bezeichnung, version, stand, format, status, faxabruf, dateiname, originalname, idautor, idfassung, neudat, aedat, bemerkung, summary, chgdat, signatur, idsachgebiet, rechtefrei, honorarfrei, markierung, benutzer, stellvertreter, versionsnr, hidx, versionskommentar, zodb_path, idzielgruppe, rechner_version, formular_version, hidx_master, gesperrt_bis, rechnerstand, rechner_stand) VALUES (%(id)s, %(bezeichnung)s, %(version)s, %(stand)s, %(format)s, %(status)s, %(faxabruf)s, %(dateiname)s, %(originalname)s, %(idautor)s, %(idfassung)s, %(neudat)s, %(aedat)s, %(bemerkung)s, %(summary)s, %(chgdat)s, %(signatur)s, %(idsachgebiet)s, %(rechtefrei)s, %(honorarfrei)s, %(markierung)s, %(benutzer)s, %(stellvertreter)s, %(versionsnr)s, %(hidx)s, %(versionskommentar)s, %(zodb_path)s, %(idzielgruppe)s, %(rechner_version)s, %(formular_version)s, %(hidx_master)s, %(gesperrt_bis)s, %(rechnerstand)s, %(rechner_stand)s) 2007-07-02 12:02:07,855 INFO sqlalchemy.engine.base.Engine.0x..74 {'idsachgebiet': None, 'rechner_version': '', 'bemerkung': '', 'versionsnr': 0, 'idzielgruppe': 0, 'idfassung': 1, 'dateiname': 'HI1765738.pdf', 'originalname': '', 'rechnerstand': None, 'id': 96457L, 'hidx_master': None, 'rechner_stand': None, 'version': None, 'aedat': None, 'hidx': 'HI1765738', 'honorarfrei': True, 'neudat': datetime.datetime(2007, 7, 2, 12, 2, 7, 833609), 'rechtefrei': True, 'status': 4, 'signatur': None, 'faxabruf': None, 'format': 'PDF', 'stellvertreter': '', 'zodb_path': 'FO/738/HI1765738', 'markierung': None, 'chgdat': None, 'versionskommentar': None, 'idautor': 0, 'summary': 'ELSTER Teilnahmeerkl\xe4rung, die vor der ersten elektronischen Daten\xfcbermittlung mit Originalunterschrift abgegeben werden muss.', 'gesperrt_bis': None, 'stand': None, 'bezeichnung': None, 'formular_version': '', 'benutzer': 'sprollb'} 2007-07-02 12:02:07 INFO sqlalchemy.engine.base.Engine.0x..74 {'idsachgebiet': None, 'rechner_version': '', 'bemerkung': '', 'versionsnr': 0, 'idzielgruppe': 0, 'idfassung': 1, 'dateiname': 'HI1765738.pdf', 'originalname': '', 'rechnerstand': None, 'id': 96457L, 'hidx_master': None, 'rechner_stand': None, 'version': None, 'aedat': None, 'hidx': 'HI1765738', 'honorarfrei': True, 'neudat': datetime.datetime(2007, 7, 2, 12, 2, 7, 833609), 'rechtefrei': True, 'status': 4, 'signatur': None, 'faxabruf': None, 'format': 'PDF', 'stellvertreter': '', 'zodb_path': 'FO/738/HI1765738', 'markierung': None, 'chgdat': None, 'versionskommentar': None, 'idautor': 0, 'summary': 'ELSTER Teilnahmeerkl\xe4rung, die vor der ersten elektronischen Daten\xfcbermittlung mit Originalunterschrift abgegeben werden muss.', 'gesperrt_bis': None, 'stand': None, 'bezeichnung': None, 'formular_version': '', 'benutzer': 'sprollb'}
FROM arbeitsmittel
WHERE arbeitsmittel.id = %(arbeitsmittel_id)s
2007-07-02 12:02:07,867 INFO sqlalchemy.engine.base.Engine.0x..74 {'arbeitsmittel_id': 96457L} 2007-07-02 12:02:08,219 INFO sqlalchemy.engine.base.Engine.0x..74 INSERT INTO zielgruppen () VALUES ()
2007-07-02 12:02:08,219 INFO sqlalchemy.engine.base.Engine.0x..74 {}
2007-07-02 12:02:08,221 INFO sqlalchemy.engine.base.Engine.0x..74 ROLLBACK

The "INSERT INTO zielgruppen...." is wrong and not requested. The 'zielgruppen' table looks like this and is empty except one dummy row with id=0 and has no relationship to the 'arbeitsmittel' table. Although adding an explicit ForeignKeyConstraint for 'idzielgruppe' did not help.


Toolbox2Test=# \d zielgruppen
                                    Table "public.zielgruppen"
  Column    |          Type          |                          Modifiers
-------------+------------------------+-------------------------------------------------------------
id | integer | not null default nextval('public.zielgruppen_id_seq'::text)
bezeichnung | character varying(256) |
kuerzel     | character varying(32)  |


So why the hell is SA trying to insert something into my 'zielgruppen' table?

Removing

               ZielGruppenTable.c.id.label('zielgruppen_id')

from the select() makes the problem disappear however I don't know why

To complete the description of my problem, here is the schema of the 'arbeitsmittel' table:


Toolbox2Test=# \d arbeitsmittel
                                             Tabelle ;public.arbeitsmittel+
Spalte | Typ | Attribute
-------------------------------+--------------------------------+----------------------------------------------------------
id | bigint | not null default nextval('"arbeitsmittel_id_key"'::text)
idgattung                     | integer                        | default 0
bezeichnung                   | character varying(255)         |
version                       | character varying(30)          |
stand                         | timestamp without time zone    |
format                        | character varying(10)          |
status                        | integer                        | default 0
umfang                        | integer                        | default 0
seiten                        | integer                        | default 0
faxabruf                      | character varying(50)          |
dateiname                     | character varying(255)         |
originalname                  | character varying(255)         |
idautor                       | integer                        | default 0
idfassung                     | integer                        | default 0
neudat                        | timestamp without time zone    |
aedat                         | timestamp without time zone    |
bemerkung                     | text                           |
summary                       | text                           |
chgdat                        | timestamp(0) without time zone |
signatur                      | character varying(255)         |
idsachgebiet                  | integer                        |
rechtefrei                    | boolean                        |
honorarfrei                   | boolean                        |
markierung                    | boolean                        |
benutzer | character varying(32) | default ''::character varying
stellvertreter                | character varying(32)          |
versionsnr                    | integer                        | default 0
num_rtf                       | integer                        | default 0
num_hre                       | integer                        | default 0
num_pdf                       | integer                        | default 0
hidx                          | character varying(16)          |
versionskommentar             | character varying(1024)        |
versionsize                   | bigint                         | default 0
zodb_path                     | character varying(1024)        |
idzielgruppe                  | integer                        | default 0
generator_tauglich | boolean | default false stammdatenverwaltung_tauglich | boolean | default false rechner_version | character varying(10) | default ''::character varying formular_version | character varying(10) | default ''::character varying
hidx_master                   | character varying(10)          |
gesperrt_bis                  | timestamp without time zone    |
sperrgrund | character varying(255) | default ''::character varying
rechnerstand                  | timestamp without time zone    |
rechner_stand                 | timestamp without time zone    |
Indexe:
   ;arbeitsmittel_pkey+ Primä²³chl|ssel, btree (id)
   ;arbeitsmittel_unique_hidx_vnr+ eindeutig, btree (hidx, versionsnr)
   ;arbeitsmittel_aedat_idx+ btree (aedat)
   ;arbeitsmittel_hidx_idx+ btree (hidx)
   ;arbeitsmittel_idautor_idx+ btree (idautor)
   ;arbeitsmittel_idfassung_idx+ btree (idfassung)
   ;arbeitsmittel_neudat_idx+ btree (neudat)
   ;arbeitsmittel_versionsnr_idx+ btree (versionsnr)
   ;hidx_master_hidx+ btree (hidx_master)



Attachment: pgpMrMU8rTZHs.pgp
Description: PGP signature

Reply via email to