2011-09-04 42 views
17

Tôi đã tạo một bảng bằng cách sử dụng SQLAlchemy và quên thêm cột. Về cơ bản tôi muốn làm điều này:thêm cột vào SQLAlchemy Bảng

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

Cú pháp cho điều này là gì? Tôi không thể tìm thấy nó trong tài liệu.

Trả lời

13

Điều này được gọi là di chuyển cơ sở dữ liệu (SQLAlchemy không hỗ trợ di chuyển ra khỏi hộp). Bạn có thể xem xét sử dụng sqlalchemy-migrate để giúp đỡ trong các loại tình huống này, hoặc bạn có thể chỉ ALTER TABLE thông qua tiện ích dòng lệnh cơ sở dữ liệu được lựa chọn của bạn,

+5

Vì vậy, tôi phải di chuyển toàn bộ cơ sở dữ liệu chỉ để thêm cột? Điều đó nghe có vẻ không vui. Cảm ơn! – Chris

+0

Vì vậy, đối với ALTER TABLE, tôi có thể làm điều đó thông qua SQLAlchemy (tức là nó hỗ trợ viết SQLite thẳng)? Nhưng tôi sẽ di chuyển – Chris

+6

Không, SQLAlchemy không hỗ trợ sửa đổi bảng cơ sở dữ liệu, chỉ cần tạo. Bạn sẽ phải thực hiện 'ALTER' thông qua sqlite3. –

12

Tôi có cùng một vấn đề và ý nghĩ sử dụng thư viện di chuyển chỉ dành cho điều tầm thường này làm cho tôi
run rẩy. Dù sao, đây là nỗ lực của tôi cho đến nay:

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) 

Tuy nhiên, tôi không biết cách chèn primary_key=True vào yêu cầu SQL thô.

4

Tôi có cơ sở dữ liệu được gọi là "ncaaf.db" được xây dựng với sqlite3 và một bảng có tên là "trò chơi". Vì vậy, tôi sẽ CD vào cùng một thư mục trên dấu nhắc lệnh linux của tôi và làm

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

và đó là tất cả phải mất! Chỉ cần chắc chắn rằng bạn cập nhật các định nghĩa của bạn trong mã sqlalchemy của bạn.

0

Cùng một vấn đề ở đây. Những gì tôi sẽ làm là lặp qua db và thêm mỗi mục vào một cơ sở dữ liệu mới với cột phụ, sau đó xóa db cũ và đổi tên mới thành cái này.

3

Tôi đã có cùng một vấn đề, tôi đã kết thúc chỉ viết chức năng của riêng tôi trong sql thô. Nếu bạn đang sử dụng SQLITE3, điều này có thể hữu ích.

Sau đó, nếu bạn thêm cột vào định nghĩa lớp học của bạn cùng một lúc, có vẻ như nó sẽ thực hiện thủ thuật.

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() 
Các vấn đề liên quan