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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/sqlalchemy/DB8PR09MB3372A5AEA1D3D219C8EC882893310%40DB8PR09MB3372.eurprd09.prod.outlook.com.