Hello,

I have below use where

Employer and EmployerPhone the one emp can have multiple phone number out 
of which at any given point of time there should be 
only one 'is_active' due to concurrency load, emp_phone got multiple 
'is_active' as 'Y' in emp_phone i want to update the emp_phone table
records to have only is_active record for a given emp.  I tried out query 
and Expression Language to fix this, but i am not lucky enough to fix this. 

Could anyone suggest me to write query in SqlAlchemy to fix this issue.

I have also attached sample python file which i tried with SqlLite.

####################################
from sqlalchemy import *
from sqlalchemy.orm import sessionmaker, mapper

#Actual use case is with SQL Server 2008 and Oracle
#uri = "mssql+mxodbc://sa:sa@master"
#engine = create_engine(uri)

#Tried with SQL Lite
engine = create_engine('sqlite:///:memory:', echo=True)
session = sessionmaker(bind=engine)
session = session()

#Define tables....
metadata = MetaData()

emp = Table("emp", metadata,
            Column("emp_idn", Integer, primary_key=True, 
autoincrement=True),
            Column("emp_name", String),
            Column("is_active", String),
            )
emp_phone = Table("emp_phone", metadata,
    Column("phone_no", String),
    Column("emp_phone_idn", Integer, primary_key=True, autoincrement=True),
    Column("emp_idn", Float, ForeignKey('emp.emp_idn')),
    Column("is_active", String))

metadata.create_all(engine)

#Define model.
class Emp(object):
    pass

class EmpPhone(object):
    pass

#mapping...
mapper(Emp, emp)
mapper(EmpPhone, emp_phone)

#My goal is to Use Session to create Emp and Emp Phone.
emp = Emp()
emp.emp_name = 'Royal'
emp.is_active = 'Y'
session.add(emp)
session.flush()

emp = Emp()
emp.emp_name = 'Royal Eng'
emp.is_active = 'Y'
session.add(emp)
session.flush()

empPhone = EmpPhone()
empPhone.emp_idn = emp.emp_idn
empPhone.phone_no = '12345'
empPhone.is_active = 'Y'
session.add(empPhone)
session.flush()

empPhone = EmpPhone()
empPhone.emp_idn = emp.emp_idn
empPhone.phone_no = '67890'
empPhone.is_active = 'Y'
session.add(empPhone)
session.flush()


#Update all the Duplicate is_active records with 'N' which are duplicted 
per emp_idn
#There should be only one active phone number per emp
sub_qry = session.query(EmpPhone.emp_idn).filter(EmpPhone.is_active=='Y')
sub_qry = sub_qry.group_by(EmpPhone.emp_idn)
sub_qry = sub_qry.having(func.count(EmpPhone.emp_idn) > 1)
upd_qry = 
session.query(EmpPhone).filter(EmpPhone.emp_idn.in_(sub_qry)).update({'is_active':
 
'N'}, False)

session.commit()
for each in session.query(EmpPhone).all():
    print each.emp_idn, each.phone_no, each.is_active

##My Goal is to update the emp_phone records having multiple is_active to 
have
##only once is_active as 'Y' based on last loaded record for one employee.
##I figured out raw sql, how ever i am not able get this done in SQ Query 
or SQ expression langauge.

#====Raw SQL====#  SQ Query or SQ expression langauge
#Update emp_phone set is_active='Y' 
#from emp_phone b inner join (
#Select emp_idn, max(emp_phone_idn) max_emp_phone_idn from emp_phone group 
by emp_idn) 
#a on a.max_emp_phone_idn =b.phone_num_idn
#====Raw SQL====#


####################################


Thanks in advance,

Praveen

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/sqlalchemy/-/R_pRZBMlVDgJ.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

from sqlalchemy import *
from sqlalchemy.orm import sessionmaker, mapper

#Actual use case is with SQL Server 2008 and Oracle
#uri = "mssql+mxodbc://sa:sa@master"
#engine = create_engine(uri)

#Tried with SQL Lite
engine = create_engine('sqlite:///:memory:', echo=True)
session = sessionmaker(bind=engine)
session = session()

#Define tables....
metadata = MetaData()

emp = Table("emp", metadata,
            Column("emp_idn", Integer, primary_key=True, autoincrement=True),
            Column("emp_name", String),
            Column("is_active", String),
            )
emp_phone = Table("emp_phone", metadata,
    Column("phone_no", String),
    Column("emp_phone_idn", Integer, primary_key=True, autoincrement=True),
    Column("emp_idn", Float, ForeignKey('emp.emp_idn')),
    Column("is_active", String))

metadata.create_all(engine)

#Define model.
class Emp(object):
    pass

class EmpPhone(object):
    pass

#mapping...
mapper(Emp, emp)
mapper(EmpPhone, emp_phone)

#My goal is to Use Session to create Emp and Emp Phone.
emp = Emp()
emp.emp_name = 'Royal'
emp.is_active = 'Y'
session.add(emp)
session.flush()

emp = Emp()
emp.emp_name = 'Royal Eng'
emp.is_active = 'Y'
session.add(emp)
session.flush()

empPhone = EmpPhone()
empPhone.emp_idn = emp.emp_idn
empPhone.phone_no = '12345'
empPhone.is_active = 'Y'
session.add(empPhone)
session.flush()

empPhone = EmpPhone()
empPhone.emp_idn = emp.emp_idn
empPhone.phone_no = '67890'
empPhone.is_active = 'Y'
session.add(empPhone)
session.flush()


#Update all the Duplicate is_active records with 'N' which are duplicted per emp_idn
#There should be only one active phone number per emp
sub_qry = session.query(EmpPhone.emp_idn).filter(EmpPhone.is_active=='Y')
sub_qry = sub_qry.group_by(EmpPhone.emp_idn)
sub_qry = sub_qry.having(func.count(EmpPhone.emp_idn) > 1)
upd_qry = session.query(EmpPhone).filter(EmpPhone.emp_idn.in_(sub_qry)).update({'is_active': 'N'}, False)

session.commit()
for each in session.query(EmpPhone).all():
    print each.emp_idn, each.phone_no, each.is_active

##My Goal is to update the emp_phone records having multiple is_active to have
##only once is_active as 'Y' based on last loaded record for one employee.
##I figured out raw sql, how ever i am not able get this done in SQ Query or SQ expression langauge.

#====Raw SQL====#  SQ Query or SQ expression langauge
#Update emp_phone set is_active='Y' 
#from emp_phone b inner join (
#Select emp_idn, max(emp_phone_idn) max_emp_phone_idn from emp_phone group by emp_idn) 
#a on a.max_emp_phone_idn =b.phone_num_idn
#====Raw SQL====#


Reply via email to