2011-11-16 31 views
8

Tôi đang chọn đối tượng Python trong Django và lưu nó trong MySQL db. Cho đến nay tôi đã đi theo những quy tắc đơn giản:Tiết kiệm Python Đối tượng được chọn trong MySQL db

  1. cPickle.dumps(object) #to chuyển đổi đối tượng python để đối tượng ngâm

  2. cPickle.loads(pickled_object) # để nạp lại các đối tượng python từ đối tượng ngâm

  3. My Django Model FieldText Field

  4. Trường db MySQL Loại là longblob Attrib Utes binary

  5. MySQL mã hóa db là utf8_unicode_ci

Đáng tiếc là tôi đang nhận được lỗi sau khi tải lại đối tượng python.

Type Error: ('an integer is required', <type 'datetime.date'>, ('x07xb6x0bx06',)) 

Dường như với tôi bằng cách xem giá trị lỗi x07xb6x0bx06 đây là sự cố mã hóa. Tôi đã bỏ lỡ một số bước quan trọng? Bất kỳ ai có thể giúp tôi để giải quyết vấn đề này?

+1

Bạn có một lý do cụ thể để sử dụng dưa? Đó là một định dạng nhị phân và chỉ có thể sử dụng được bằng python. Nếu bạn có lựa chọn, liệu JSON có phải là một lựa chọn tốt hơn không? –

+0

JSON không phục vụ mục đích của tôi, tôi cố gắng sử dụng 'json.dumps' nhưng có lỗi này' some_object không phải là JSON serializable'. Và đối tượng là tinh khiết Pythonic. –

+2

Bạn cũng nên cố gắng làm cho đối tượng đó nối tiếp được. Đó là trợ giúp * lớn * để có nội dung có thể đọc được của con người trong db của bạn khi bạn đang cố tìm lỗi. –

Trả lời

5

Nếu bạn đang cố gắng lưu trữ đầu ra của cPickle.dumps trong cột VARCHAR, thì vấn đề của bạn là bạn đang cố gắng lưu trữ chuỗi byte trong cột ký tự. Việc sửa chữa trong trường hợp đó là để mã hóa đối tượng của bạn là unicode(base64.encode(cPickle.dumps(myobject))) và sau đó lưu trữ nó.

Hoặc:

object2varchar = lambda obj: unicode(base64.encode(cPickle.dumps(obj))) 
store(object2varchar([1, 'foo'])) 
1

một quy tắc khác: kết nối với mysql với tùy chọn charset=utf8?

UPD1: Đôi khi nó là một ý tưởng tốt để xem xét các truy vấn SQL hoàn chỉnh, tôi thường làm theo cách đó:

>>> conn = MySQLdb.connect(**db_params) 
>>> "INSERT INTO tbl VALUES (%s)" % conn.literal((your_pickled_item,)) 
+0

Không có điều này không giúp tôi. Cùng một lỗi nữa. –

+0

@ aamir-adnan, bạn đã cố gắng lưu và đọc một mục mới thay vì đọc đã được lưu chưa? – newtover

+0

Câu hỏi hay, có tôi đã kiểm tra nó, nó hoạt động tốt khi tôi chuyển đổi và khôi phục đối tượng python trong mã, đó là vấn đề với db trong khi đọc hoặc không lưu trữ đúng cách. Tôi nên làm gì? Hãy giúp tôi. –

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