2011-09-04 11 views
17

पर कॉलम जोड़ें I SQLAlchemy का उपयोग करके एक तालिका बनाई और कॉलम जोड़ने के लिए भूल गए। मैं मूल रूप से ऐसा करना चाहता हूं:SQLAlchemy तालिका

users.addColumn('user_id', ForeignKey('users.user_id')) 

इसके लिए वाक्यविन्यास क्या है? मैं इसे दस्तावेज़ों में नहीं ढूंढ सका।

उत्तर

13

इसे डेटाबेस माइग्रेशन के रूप में जाना जाता है (SQLAlchemy बॉक्स के बाहर माइग्रेशन का समर्थन नहीं करता है)। आप sqlalchemy-migrate का उपयोग कर स्थितियों के इन प्रकार में मदद करने के लिए देख सकते हैं, या आप बस ALTER TABLE अपनी चुनी डेटाबेस के कमांड लाइन उपयोगिता के माध्यम से,

+5

तो मुझे कॉलम जोड़ने के लिए पूरे डेटाबेस को माइग्रेट करना होगा? यह मजेदार की तरह नहीं लगता है। धन्यवाद! – Chris

+0

तो वैकल्पिक तालिका के लिए, क्या मैं एसक्यूएलकेमी के माध्यम से ऐसा कर सकता हूं (यानी क्या यह सीधे SQLite लिखने का समर्थन करता है)? लेकिन मुझे माइग्रेशन – Chris

+6

पर नहीं मिलेगा, SQLAlchemy डेटाबेस तालिका संशोधन का समर्थन नहीं करता है, बस सृजन। आपको sqlite3 के माध्यम से 'ALTER' करना होगा। –

10

SQLAlchemy प्रलेखन के इस खंड देखें कर सकते हैं: http://docs.sqlalchemy.org/en/latest/core/metadata.html#altering-schemas-through-migrations

Alembic करने के लिए नवीनतम सॉफ्टवेयर है इस प्रकार की कार्यक्षमता प्रदान करें और उसी लेखक द्वारा SQLAlchemy के रूप में बनाया गया है।

12

मुझे एक ही समस्या है, और केवल इस छोटी सी चीज के लिए माइग्रेशन लाइब्रेरी का उपयोग करने का विचार मुझे
थरथरा बनाता है।

def add_column(engine, table_name, column): 
    column_name = column.compile(dialect=engine.dialect) 
    column_type = column.type.compile(engine.dialect) 
    engine.execute('ALTER TABLE %s ADD COLUMN %s %s' % (table_name, column_name, column_type)) 

column = Column('new column', String(100), primary_key=True) 
add_column(engine, table_name, column) 

फिर भी, मैं कच्चे एसक्यूएल अनुरोध में primary_key=True सम्मिलित करने के लिए पता नहीं कैसे: वैसे भी, यह मेरा प्रयास अब तक है।

4

मेरे पास "ncaaf.db" नामक डेटाबेस है जिसे sqlite3 के साथ बनाया गया है और "गेम" नामक एक टेबल है। तो मैं अपने लिनक्स कमांड प्रॉम्प्ट पर एक ही निर्देशिका में सीडी करता हूं और

sqlite3 ncaaf.db 
alter table games add column q4 type float 

और यह सब कुछ लेता है! बस सुनिश्चित करें कि आप अपने स्क्लेक्लेमी कोड में अपनी परिभाषाओं को अपडेट करते हैं।

0

यहां पर एक ही समस्या है। मैं क्या करूँगा डीबी पर फिर से चल रहा है और अतिरिक्त प्रविष्टि के साथ प्रत्येक प्रविष्टि को एक नए डेटाबेस में जोड़ता है, फिर पुराने डीबी को हटा दें और इस पर नया नाम बदलें।

3

मुझे एक ही समस्या थी, मैंने कच्चे वर्ग में अपना खुद का कार्य लिखना समाप्त कर दिया। यदि आप SQLITE3 का उपयोग कर रहे हैं तो यह उपयोगी हो सकता है।

फिर यदि आप एक ही समय में अपनी कक्षा परिभाषा में कॉलम जोड़ते हैं तो यह चाल चल रहा है।

import sqlite3 

def add_column(database_name, table_name, column_name, data_type): 

    connection = sqlite3.connect(database_name) 
    cursor = connection.cursor() 

    if data_type == "Integer": 
    data_type_formatted = "INTEGER" 
    elif data_type == "String": 
    data_type_formatted = "VARCHAR(100)" 

    base_command = ("ALTER TABLE '{table_name}' ADD column '{column_name}' '{data_type}'") 
    sql_command = base_command.format(table_name=table_name, column_name=column_name, data_type=data_type_formatted) 

    cursor.execute(sql_command) 
    connection.commit() 
    connection.close()