2011-12-21 34 views
6

'u kullanarak MySQL'in son eklenen değerini aldım. Sadece oldukça sıkıntılarla karşılaştığım bir problemle karşılaştım ve test ettikten sonra mevcut cevapların NONE olduğunu yeterli buldum.SQLAlchemy

Çeşitli önerileri gördüm ancak hiçbiri MySQL'de bir auto_increment alanı için son eklenen değeri döndüremiyor gibi görünüyor.

Kaydı eklemek ve daha sonra kimliği almak için session.flush() kullanımından bahseden örnekleri gördüm. Ancak her zaman ben de session.refresh (kullanılmasından söz örneklerini gördük 0.

dönmek görünüyor) ama bu şu hatayı yükseltir: InvalidRequestError: örneğini '' Ben ne

yenilemek Could yapmaya çalışmak çılgınca basit görünüyor ama sırrı anlayamıyorum.

Bildiri yaklaşımını kullanıyorum. Nesne f DB itti edilmiştir ve otomatik olarak benzersiz bir birincil anahtar kimliği atanmıştır Bu noktada

class Foo(Base): 
    __tablename__ = 'tblfoo' 
    __table_args__ = {'mysql_engine':'InnoDB'} 

    ModelID = Column(INTEGER(unsigned=True), default=0, primary_key=True, autoincrement=True) 
    ModelName = Column(Unicode(255), nullable=True, index=True) 
    ModelMemo = Column(Unicode(255), nullable=True) 

f = Foo(ModelName='Bar', ModelMemo='Foo') 
session.add(f) 
session.flush() 

:

Yani, benim kod şöyle görünür. Ancak, bazı ek işlemlerde kullanılacak değeri elde etmenin bir yolunu bulamıyorum. Ben aşağıdakileri yapmak istiyorum:

my_new_id = f.ModelID

Ben sadece diğer parametrelere dayalı ModelID arama için başka bir sorgu yürütebilir ama değil eğer mümkünse tercih edeceğini biliyorum.

Bu sorunun çözümüne yönelik herhangi bir kavrayışı çok takdir ediyorum.

Yardımlarınız için şimdiden teşekkür ederiz.

cevap

9

Sorun, otomatik artış için defaul ayarlıyorsunuz. Sorguya içine insert çalıştırdığınızda Yani sunucunun günlük Yani çıkış varsayılan değerdir ve autoincrement sütun için varsayılan değer oluşturmaya çünkü geçirilir hangi 0 olduğunu

2011-12-21 13:44:26,561 INFO sqlalchemy.engine.base.Engine.0x...1150 INSERT INTO tblfoo (`ModelID`, `ModelName`, `ModelMemo`) VALUES (%s, %s, %s) 
2011-12-21 13:44:26,561 INFO sqlalchemy.engine.base.Engine.0x...1150 (0, 'Bar', 'Foo') 
ID : 0 

olduğunu.

default olmadan aynı kodu çalıştırırsam, doğru çıktıyı verir.

Bu kodu

from sqlalchemy import create_engine 
engine = create_engine('mysql://test:[email protected]/test1', echo=True) 

from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 

from sqlalchemy.orm import sessionmaker 
Session = sessionmaker(bind=engine) 

session = Session() 

from sqlalchemy import Column, Integer, Unicode 

class Foo(Base): 
    __tablename__ = 'tblfoo' 
    __table_args__ = {'mysql_engine':'InnoDB'} 

    ModelID = Column(Integer, primary_key=True, autoincrement=True) 
    ModelName = Column(Unicode(255), nullable=True, index=True) 
    ModelMemo = Column(Unicode(255), nullable=True) 

Base.metadata.create_all(engine) 

f = Foo(ModelName='Bar', ModelMemo='Foo') 
session.add(f) 
session.flush() 

print "ID :", f.ModelID 
+1

Güzel yakalama, varsayılan = 0 fark etmedi. –

+1

Sunucu günlüğü her zaman sorunu bulmak için çalışacaktır :) – Nilesh

+1

Ugh ... evet, güzel yakalama. Kafam, tabloyu oluştururken birincil anahtar alan için varsayılan bir değerin gerekli olduğu SQL dünyasındaydı. Bulduğun için teşekkürler. – PlaidFan

1

session.flush() yerine session.commit() kullanmayı deneyin. Daha sonra f.ModelID'u kullanabilirsiniz.

+0

ben floş hem sonra denedim ve taahhüt ancak aşağıdaki hatayı aldım: AttributeError: 'Foo' nesne hiçbir özellik 'kimlik' – PlaidFan

+0

Maalesef güncellenen vardır Şema bildiriminde kullandığınız gibi ModelID'yi kullanma cevabı. Yine de, muhtemelen 'ModelID' yerine 'id 'kullanmalısınız. –

+0

Ne yazık ki, bu yaklaşımı birçok yolla denedim ve şu hatayı almaya devam ettim: ObjectDeletedError: '' 'örneği silindi. – PlaidFan

1

bayraklı cevap sizin için çalıştı emin niçin deneyin. Ama benim durumumda, bu aslında satırı masaya eklemiyor. Sonunda commit()'u aramam gerek.

Yani kodunun son birkaç satır şunlardır:

f = Foo(ModelName='Bar', ModelMemo='Foo') 
session.add(f) 
session.flush() 

print "ID:", f.ModelID 

session.commit()