2010-03-11 11 views
7

मैं डेटाबेस परिवर्तनों का ट्रैक रखने के लिए स्क्लेक्लेमी माइग्रेट का उपयोग कर रहा हूं और मैं एक विदेशी कुंजी को हटाने के साथ किसी समस्या में भाग रहा हूं। मेरे पास दो टेबल हैं, t_new एक नई तालिका है, और t_exists एक मौजूदा तालिका है। मुझे t_new जोड़ने की जरूरत है, फिर t_exists को एक विदेशी कुंजी जोड़ें। तो मुझे ऑपरेशन को उलट करने में सक्षम होना चाहिए (जहां मुझे परेशानी हो रही है)।मैं स्क्लाक्लेमी में एक विदेशी कुंजी बाधा को कैसे हटा सकता हूं?

t_new = sa.Table("new", meta.metadata, 
    sa.Column("new_id", sa.types.Integer, primary_key=True) 
) 
t_exists = sa.Table("exists", meta.metadata, 
    sa.Column("exists_id", sa.types.Integer, primary_key=True), 
    sa.Column(
     "new_id", 
     sa.types.Integer, 
     sa.ForeignKey("new.new_id", onupdate="CASCADE", ondelete="CASCADE"), 
     nullable=False 
    ) 
) 

यह ठीक काम करता है:

t_new.create() 
t_exists.c.new_id.create() 

लेकिन यह नहीं है: 1025, के नाम बदलने पर "त्रुटि ':

t_exists.c.new_id.drop() 
t_new.drop() 

विदेशी कुंजी स्तंभ ड्रॉप करने की कोशिश कर रहा एक त्रुटि देता है। \ my_db_name \ # sql-1b0_2e6 'to'। \ my_db_name \ exist '(errno: 150) "

यदि मैं कच्चे SQL के साथ ऐसा करता हूं, तो मैं f को हटा सकता हूं ओरेगिन कुंजी मैन्युअल रूप से कॉलम को हटा दें, लेकिन मैं यह समझने में सक्षम नहीं हूं कि SQLAlchemy के साथ विदेशी कुंजी को कैसे निकाला जाए? मैं विदेशी कुंजी, और फिर कॉलम को कैसे हटा सकता हूं?

उत्तर

5

आप इसे sqlalchemy.migrate के साथ कर सकते हैं।

आदेश में यह काम करते हैं, मैं विदेशी कुंजी बाधा बनाने के स्पष्ट रूप से नहीं बल्कि स्तंभ ('FK', ForeignKey ('fk_table.field')) के साथ implicitely से करना पड़ा है बनाने के लिए:

ओह, बजाय कर रही है इस:

p2 = Table('tablename', 
      metadata, 
      Column('id', Integer, primary_key=True), 
      Column('fk', ForeignKey('fk_table.field')), 
      mysql_engine='InnoDB', 
      ) 

कि कार्य करें:

p2 = Table('tablename', 
      metadata, 
      Column('id', Integer, primary_key=True), 
      Column('fk', Integer, index=True), 
      mysql_engine='InnoDB', 
      ) 
ForeignKeyConstraint(columns=[p2.c.fk], refcolumns=[p3.c.id]).create() 

तो हटाने की प्रक्रिया इस प्रकार है:

def downgrade(migrate_engine): 
    # First drop the constraint 
    ForeignKeyConstraint(columns=[p2.c.fk], refcolumns=[p3.c.id]).drop() 
    # Then drop the table 
    p2.drop() 
+2

जो भी इसमें भाग ले सकता है - विदेशी के लिए कॉन्स्ट्रेन को 'माइग्रेट' से 'sqlalchemy' से आयात नहीं किया जाना चाहिए। – mjallday

2

मैं कच्चे एसक्यूएल चलाने के लिए एक अलग मेटाडेटा इंस्टेंस और सत्र.एक्सक्यूट() का उपयोग करके इसे पूरा करने में सक्षम था। आदर्श रूप में, एक ऐसा समाधान होगा जो विशेष रूप से स्क्लेक्केमी का उपयोग करता है, इसलिए मुझे MySQL- विशिष्ट समाधानों का उपयोग नहीं करना पड़ेगा। लेकिन अभी तक, मुझे इस तरह के समाधान से अवगत नहीं है।

+3

जिज्ञासा से, आपने जिस SQL ​​को निष्पादित किया था, वह क्या था? –

-1

ठीक है, आप SQLAlchemy में इस लक्ष्य को हासिल कर सकते हैं: बस drop() तुम सब drop() से पहले की कमी स्तंभ (सैद्धांतिक रूप से, आप कई बाधाओं हो सकता है):

def drop_column(column): 
    for fk in column.table.foreign_keys: 
     if fk.column == column: 
      print 'deleting fk ', fk 
      fk.drop() 
    column.drop() 

drop_column(t_exists.c.new_id) 
+0

मैंने इसे आजमाया, लेकिन एक त्रुटि मिली: 'ForeignKey' ऑब्जेक्ट में कोई विशेषता 'ड्रॉप' नहीं है। मैंने दस्तावेज़ों की जांच की लेकिन इसे करने का कोई तरीका नहीं देखा: http://www.sqlalchemy.org/docs/reference/sqlalchemy/schema.html?highlight=foreignkey#sqlalchemy.schema।विदेशीकी – Travis

+0

यह उचित है, लेकिन मुझे एसए का दस्तावेज दिखाएं जहां कॉलम ड्रॉप(): http://www.sqlalchemy.org/docs/reference/sqlalchemy/schema.html?highlight=foreignkey#sqlalchemy.schema.Column – van

+0

'स्क्लाक्लेमी-माइग्रेट' ड्रॉप(),() और अन्य नस्लों को जोड़ता है लेकिन इसे अलग से स्थापित करने की आवश्यकता है। Http://packages.python.org/sqlalchemy-migrate/index.html – OrganicPanda

0

मेरा मानना ​​है कि आप SQLAlchemy- साथ इस लक्ष्य को हासिल कर सकते हैं स्थानांतरित करें। ध्यान दें कि एक विदेशीकी एक अलग कॉलम पर है। एक विदेशी Keystraint तालिका स्तर पर है और कॉलम एक साथ संबंधित है। यदि आप कॉलम पर विदेशीकी ऑब्जेक्ट देखते हैं तो आप देखेंगे कि यह एक विदेशी केक कॉन्स्ट्रेन का संदर्भ देता है।

मैं इस विचार का परीक्षण करने में असमर्थ हूं क्योंकि एमएस एसक्यूएल का उपयोग करने वाले दो डेटाबेस एसकएलएल्केमी-माइग्रेट द्वारा समर्थित नहीं है और एसक्लाइट बाधाओं के लिए "तालिका को बदलने" का समर्थन नहीं करता है। मुझे स्क्लाइट टेबल पर संदर्भ बाधाओं पर एक बूंद के माध्यम से एक एफके को हटाने की कोशिश करने के लिए SQLAlchemy प्राप्त हुआ था, इसलिए यह अच्छा लग रहा था। YMMV।

संबंधित मुद्दे