2012-03-28 15 views
12

मैं एक वर्ग मिल गया है:SQLAlchemy अद्यतन करता है, तो अद्वितीय कुंजी मौजूद है

class Tag(Base, TimestampMixin): 
    """Tags""" 
    __tablename__ = 'tags' 
    __table_args__ = {'mysql_engine' : 'InnoDB', 'mysql_charset' : 'utf8' } 

    id = Column(Integer(11), autoincrement = True, primary_key = True) 
    tag = Column(String(32), nullable = False, unique = True) 
    cnt = Column(Integer(11), index = True, nullable = False, default = 1) 

    def __init__(self, tag): 
     t = session.query(Tag).filter_by(tag=tag).first() 
     if t: 
      self.cnt = t.cnt+1 
      self.tag = t.tag 
     else: 
      self.tag = tag 

    def __repr__(self): 
     return "<Tag('%s')>" % (self.tag,) 

    def __unicode__(self): 
     return "%s" % (self.tag,) 

टैग जोड़ते:

tag = Tag('tag') 
session.add(tag) 
session.commit() 

मैं इसे मौजूदा tag अपडेट करना चाहते हैं। - संभवतः मुझे बन्दूक सर्जरी के बाहर रखता है

tag = session.query(Tag).filter_by(tag='tag').first() 
if tag: 
    tag.cnt++ 
else: 
    tag = Tag('tag') 
session.add(tag) 
session.commit() 

लेकिन, Tag कक्षा में इस तरह के तर्क रखते हुए और अधिक स्पष्ट हो रहा है:

बेशक

, मैं ऐसा करने के बाद हो सकता है।

मैं वहां कैसे जा सकता हूं? मैं Python और SQLAlchemy पर बहुत नया हूं, इसलिए मेरे कोड पर किसी भी अतिरिक्त विचार की सराहना की जाएगी।

धन्यवाद।

पीएस SQLAlchemy SO GIGANTIC है और वे INSERT ... ON DUPLICATE KEY UPDATE करने के लिए एक आसान तरीका प्रदान नहीं करते हैं, हुह? वाह!

+2

कोशिश session.me session.add (टैग) के बजाय rge (टैग) –

उत्तर

6

संस्करण से जांच कर सकते हैं इस

def get_or_increase_tag(tag_name): 
    tag = session.query(Tag).filter_by(tag=tag_name).first() 
    if not tag: 
     tag = Tag(tag_name) 
    else: 
     tag.cnt += 1 
    return tag 

कोशिश कर सकते हैं 1.2 SQLAlchemy के लिए on_duplicate_key_update का समर्थन करेंगे MySQL

वहाँ भी कैसे उपयोग करने के लिए की examples है यह:

from sqlalchemy.dialects.mysql import insert 

insert_stmt = insert(my_table).values(
    id='some_existing_id', 
    data='inserted value') 

on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update(
    data=insert_stmt.values.data, 
    status='U' 
) 

conn.execute(on_duplicate_key_stmt) 

के लिए संस्करण 1.1 SQLAlchemy समर्थन on_conflict_do_update से PostgreSQL

Examples:

from sqlalchemy.dialects.postgresql import insert 

insert_stmt = insert(my_table).values(
    id='some_existing_id', 
    data='inserted value') 

do_update_stmt = insert_stmt.on_conflict_do_update(
    constraint='pk_my_table', 
    set_=dict(data='updated value') 
) 

conn.execute(do_update_stmt)