2011-01-13 63 views
12

Tôi có tệp csv với dòng đầu tiên là trường và các dòng còn lại làm dữ liệu. Với tập tin này tôi muốn tạo một bảng. Vì các trường khá dài và có thể thay đổi, tôi muốn tự động tạo nó. Sau nhiều lần thử và tìm kiếm, tôi đã tìm ra rằng tôi có thể tạo ra một Class từ nhà máy và sau đó gán các thuộc tính cho lớp mới có thể tạo ra các cột động. Nhưng nó không thành công. Và dựa trên lỗi, tôi đã thử một số phương pháp khác, tất cả đều thất bại. Hãy giúp tôi. Tôi đang xem xét cho dù đó là doable cho một ý tưởng như vậy.cách tự động tạo các cột SQLAlchemy

Reader = csv.reader(open('Book1.csv', 'rb'), delimiter=',', quotechar='|') 
TableItem = Reader.next()[0:] 
def Factory(*args, **kwargs): 
    args=args[0] 
    def init(self, *iargs, **ikwargs): 
     #setattr(self,__tablename__,ikwargs[__tablename__]) 
     for k,v in kwargs.items(): 
      setattr(self, k, v) 
     for i in range(len(iargs)): 
      setattr(self, args[i], iargs[i]) 
     for k,v in ikwargs.items(): 
      setattr(self, k, v) 

    name = kwargs.pop("name", "myFactory") 
    kwargs.update(dict((k, None) for k in args)) 
    return type(name, (object,), {'__init__': init}) 

LIS=Factory(TableItem) 
class newLIS(LIS,Base): 
    __tablename__='testonly' 
    pass 
mytest=[] 
for row in Reader: 
    mytest.append(newLIS(row)) 

Lỗi này là như sau:

sqlalchemy.exc.ArgumentError: Mapper Mapper|newLIS|testonly could not assemble 
any primary key columns for mapped table 'testonly' 
+0

được giải quyết một phần sau khi tìm http://stackoverflow.com/questions/2574105/sqlalchemy-dynamic-mapping – Nicolas

Trả lời

12

Tôi là tác giả của câu trả lời liên quan:

sqlalchemy dynamic mapping

tôi có câu trả lời này đến một câu hỏi khác, mà tôi nghĩ là thậm chí còn liên quan nhiều hơn - thậm chí có thể trùng lặp:

Database on the fly with scripting languages

Như bạn có thể thấy, để làm cho nó, bạn cần phải tạo một đối tượng bảng và ánh xạ nó đối với lớp của bạn. Ngoài ra, các lớp được ánh xạ trong sqlalchemy cần một khóa chính trên bảng, vì vậy bạn phải thêm một lớp. Bạn đang gặp phải bất kỳ vấn đề nào khác ngoài vấn đề đó? Nếu có, bạn có thể dán mã được cập nhật của mình không?

+0

Cảm ơn câu trả lời của bạn. Vâng, bản demo đó chính xác là những gì tôi sẽ tìm kiếm. – Nicolas

Các vấn đề liên quan