Dear Michael and co,

I think that Columns which are marked as server_default=FetchedValue(), which 
are normally omitted from INSERT statements, are not omitted after an object 
has been merged from another session. Therefore SQLAlchemy tries to assign the 
old values to them, which fails if the database does not allow it (e.g. 
internal columns, such as xmin in Postgres).

If this is by design, is there any way to override it on the individual objects 
before merging?

Here is an example that reproduces the error:

from sqlalchemy import Column, FetchedValue, Integer, Text, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import object_session, sessionmaker

Base = declarative_base()

class Dog(Base):
    __tablename__ = 'dog'
    __table_args__ = {'prefixes': ['TEMPORARY']}

    id = Column(Integer, primary_key=True)
    xmin = Column("xmin", Integer, server_default=FetchedValue(), 
server_onupdate=FetchedValue(), system=True)
    name = Column(Text)

def main():
    engine = create_engine('postgresql://username@server:port/db')
    engine.echo = True
    Base.metadata.create_all(engine)

    session_1 = sessionmaker(bind=engine)(autocommit=True)
    with session_1.begin():
        fido_1 = Dog(name="fido")
        session_1.add(fido_1)
    print(fido_1.xmin)

    session_2 = sessionmaker(bind=engine)(autocommit=True)

    with session_2.begin():
        session_2.query(Dog).delete()

    with sessionmaker(bind=engine)(autocommit=True).begin():
        fido_2 = session_2.merge(fido_1)
        session_2.add(fido_2)

    print(fido_2.xmin)
    print(session_2.query(Dog).count())

if __name__ == '__main__':
    main()

And the result is:

sqlalchemy.exc.ProgrammingError: (raised as a result of Query-invoked 
autoflush; consider using a session.no_autoflush block if this flush is 
occurring prematurely)
(psycopg2.ProgrammingError) column "xmin" of relation "dog" does not exist
LINE 1: INSERT INTO dog (id, xmin, name) VALUES (1, '283302364', 'fi...
                             ^
[SQL: INSERT INTO dog (id, xmin, name) VALUES (%(id)s, %(xmin)s, %(name)s)]
[parameters: {'id': 1, 'xmin': '283302364', 'name': 'fido'}]
(Background on this error at: http://sqlalche.me/e/f405)

Note that this is raised when fido_2 is inserted (after fido_1 is merged into a 
new session).

Thanks, Chris.

** Cantab Capital Partners LLP is now named GAM Systematic LLP. Please note 
that our email addresses have changed from @cantabcapital.com to @gam.com.**

This email was sent by and on behalf of GAM Investments. GAM Investments is the 
corporate brand for GAM Holding AG and its direct and indirect subsidiaries. 
These companies may be referred to as 'GAM' or 'GAM Investments'. In the United 
Kingdom, the business of GAM Investments is conducted by GAM (U.K.) Limited 
(No. 01664573) or one or more entities under the control of GAM (U.K.) Limited, 
including the following entities authorised and regulated by the Financial 
Conduct Authority: GAM International Management Limited (No. 01802911), GAM 
London Limited (No. 00874802), GAM Sterling Management Limited (No. 01750352), 
GAM Unit Trust Management Company Limited (No. 2873560) and GAM Systematic LLP 
(No. OC317557). GAM (U.K.) Limited and its regulated entities are registered in 
England and Wales. The registered office and principal place of business of GAM 
(U.K.) Limited and its regulated entities is at 8 Finsbury Circus, London, 
England, EC2M 7GB. The registered office of GAM Systematic LLP is at City 
House, Hills Road, Cambridge, CB2 1RE. This email, and any attachments, is 
confidential and may be privileged or otherwise protected from disclosure. It 
is intended solely for the stated addressee(s) and access to it by any other 
person is unauthorised. If you are not the intended recipient, you must not 
disclose, copy, circulate or in any other way use or rely on the information 
contained herein. If you have received this email in error, please inform us 
immediately and delete all copies of it. See - 
https://www.gam.com/en/legal/email-disclosures-eu/ for further information on 
confidentiality, the risks of non-secure electronic communication, and certain 
disclosures which we are required to make in accordance with applicable 
legislation and regulations. If you cannot access this link, please notify us 
by reply message and we will send the contents to you. GAM Investments will 
collect and use information about you in the course of your interactions with 
us. Full details about the data types we collect and what we use this for and 
your related rights is set out in our online privacy policy at 
https://www.gam.com/en/legal/privacy-policy. Please familiarise yourself with 
this policy and check it from time to time for updates as it supplements this 
notice.

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/DB8PR09MB3372A5AEA1D3D219C8EC882893310%40DB8PR09MB3372.eurprd09.prod.outlook.com.

Reply via email to