2013-03-21 24 views
11

Tôi đang cố gắng tìm hiểu cách sử dụng peewee với mysql.Tại sao peewee bao gồm cột 'id' vào truy vấn chọn mysql?

Tôi có cơ sở dữ liệu hiện có trên máy chủ mysql với bảng hiện có. Bảng hiện đang trống (Tôi chỉ đang thử nghiệm ngay bây giờ).

>>> db = MySQLDatabase('nhl', user='root', passwd='blahblah') 
>>> db.connect() 


>>> class schedule(Model): 
...  date = DateField() 
...  team = CharField() 
...  class Meta: 
...    database = db 

>>> test = schedule.select() 
>>> test 
<class '__main__.schedule'> SELECT t1.`id`, t1.`date`, t1.`team` FROM `nhl` AS t1 [] 
>>> test.get() 

tôi nhận được lỗi sau:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/site-packages/peewee.py", line 1408, in get 
    return clone.execute().next() 
    File "/usr/lib/python2.6/site-packages/peewee.py", line 1437, in execute 
    self._qr = QueryResultWrapper(self.model_class, self._execute(), query_meta) 
    File "/usr/lib/python2.6/site-packages/peewee.py", line 1232, in _execute 
    return self.database.execute_sql(sql, params, self.require_commit) 
    File "/usr/lib/python2.6/site-packages/peewee.py", line 1602, in execute_sql 
    res = cursor.execute(sql, params or()) 
    File "/usr/lib64/python2.6/site-packages/MySQLdb/cursors.py", line 201, in execute 
    self.errorhandler(self, exc, value) 
    File "/usr/lib64/python2.6/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
_mysql_exceptions.OperationalError: (1054, "Unknown column 't1.id' in 'field list'") 

Tại sao Peewee thêm cột 'id' vào truy vấn chọn? Tôi không có một cột id trong bảng đã tồn tại trong cơ sở dữ liệu. Tôi chỉ đơn giản muốn làm việc với bảng hiện có và không phụ thuộc vào peewee phải tạo ra mỗi khi tôi muốn tương tác với cơ sở dữ liệu. Đây là nơi tôi tin rằng lỗi là.

Kết quả của truy vấn phải trống vì bảng trống nhưng vì tôi đang học tôi chỉ muốn thử mã. Tôi đánh giá cao sự giúp đỡ của bạn.

EDIT

Dựa trên những phản hồi hữu ích bởi Wooble và Francis tôi đến tự hỏi liệu nó thậm chí còn có ý nghĩa đối với tôi để sử dụng Peewee này hay cách khác ORM như SQLAlchemy. Những lợi ích của việc sử dụng một ORM thay vì chỉ chạy các truy vấn trực tiếp trong python bằng cách sử dụng MySQLdb là gì?

Đây là những gì tôi mong đợi để được thực hiện:

-Tự động tải dữ liệu từ các máy chủ web khác nhau. Hầu hết dữ liệu ở định dạng xls hoặc csv. Tôi có thể chuyển đổi xls thành csv bằng cách sử dụng gói xlrd.

-ghi/xử lý dữ liệu trong đối tượng danh sách trước khi chèn/chèn số lượng lớn vào bảng db mysql.

truy vấn phức tạp để xuất dữ liệu từ mysql vào python thành dữ liệu thích hợp được cấu trúc (danh sách ví dụ) để tính toán thống kê dễ dàng hơn trong python thay vì mysql. Bất cứ điều gì có thể được thực hiện trong mysql sẽ được thực hiện ở đó nhưng tôi có thể chạy regressions phức tạp trong python.

chạy nhiều gói đồ họa khác nhau trên dữ liệu được truy xuất từ ​​truy vấn. Một số điều này có thể bao gồm việc sử dụng gói ggplot2 (từ R-project), đây là một gói đồ họa tiên tiến. Vì vậy, tôi sẽ liên quan đến một số tích hợp R/Python.

Đưa ra điều trên - tốt nhất là tôi bỏ ra hàng giờ để tìm hiểu ORM/Peewee/SQLAlchemy hoặc dính vào truy vấn mysql trực tiếp bằng MySQLdb?

Trả lời

15

Hầu hết các mẫu ORM hoạt động ghi lại đơn giản cần một cột id để theo dõi nhận dạng đối tượng. PeeWee dường như là một trong số họ (hoặc ít nhất tôi không biết bất kỳ cách nào để không phải sử dụng id). Bạn có thể không thể sử dụng PeeWee mà không thay đổi bảng của bạn.

Bảng hiện tại của bạn dường như không được thiết kế tốt lắm, vì dường như thiếu khóa hoặc khóa ghép. Mỗi bảng phải có thuộc tính khóa - nếu không thì không thể phân biệt một hàng với một hàng khác.

Nếu một trong các cột này là một khóa chính, hãy thử thêm một đối số primary_key=True như được giải thích in the docs concerning non-integer primary keys

date = DateField(primary_key=True) 

Lưu ý rằng tôi không chắc chắn nếu Peewee sẽ bất bình vì các khóa chính không được đặt tên id.

Bạn nên điều tra SQLAlchemy, sử dụng mẫu vẽ bản đồ dữ liệu. Nó phức tạp hơn nhiều, nhưng cũng mạnh mẽ hơn nhiều. Nó không đặt bất kỳ hạn chế nào về thiết kế bảng SQL của bạn, và trên thực tế nó có thể tự động phản ánh cấu trúc bảng và mối quan hệ tương tác của bạn trong hầu hết các trường hợp. (Có thể không tốt trong MySQL vì các mối quan hệ khóa ngoài không thể nhìn thấy trong công cụ bảng mặc định.) Quan trọng nhất đối với bạn, nó có thể xử lý các bảng thiếu khóa.

+1

Cảm ơn bạn đã trả lời chi tiết. Khi nó quay ra bảng hiện có trong cơ sở dữ liệu không có một khóa CHÍNH (ngày). Tôi có cần sử dụng pwiz như Wooble chỉ định để cung cấp thông tin này cho người nhận hàng không? Đánh giá cao sự trợ giúp. – codingknob

+0

Bạn không * cần * to - pwiz chỉ là một trình tạo mã và không làm gì bạn không thể tự làm.Có thể chỉ bao gồm đối số 'primary_key = True' như được giải thích [trong tài liệu mô tả khóa chính không phải số nguyên] (http://peewee.readthedocs.org/en/latest/peewee/models.html#non-integer-primary-keys). –

+0

Tôi đang điều tra SQLAlchemy vì peewee sẽ không làm những gì tôi muốn trong tương lai. – codingknob

0

Bạn cần cho chúng tôi tạo bảng cơ sở dữ liệu thực tế để tạo bảng cơ sở dữ liệu thực tế trước khi bạn có thể gọi select(), sẽ tạo cột id trong bảng.

+0

Điều đó có tạo bảng trong cơ sở dữ liệu thực của tôi không? Tôi đã có bảng đó trong cơ sở dữ liệu. Tôi rất bối rối vì tài liệu hướng dẫn không phải là rất thân thiện với người mới. – codingknob

+0

Ngoài ra - có hướng dẫn từng bước/ví dụ về cách làm một cái gì đó như a) kết nối với db, b) chèn các bản ghi được lưu trữ trong một đối tượng danh sách vào một bảng, c) thực hiện truy vấn phức tạp (với tham gia, nhóm-by vv .), và d) lưu trữ kết quả truy vấn trong một đối tượng danh sách python mà sau đó có thể được sử dụng cho các mục đích khác. Tài liệu hướng dẫn không giải thích đúng cách trường hợp sử dụng cuối cùng của gói và cách đi qua luồng công việc mà tôi mô tả từ a đến d ví dụ. – codingknob

+0

http://peewee.readthedocs.org/en/latest/peewee/example.html. 'Mỗi mô hình có một class_tool create_table() mà chạy một câu lệnh CREATE TABLE trong cơ sở dữ liệu. Nó sẽ tạo bảng, bao gồm tất cả các cột, constaints khóa ngoài và các chỉ mục. Thông thường, đây là điều bạn sẽ chỉ thực hiện một lần, bất cứ khi nào một mô hình mới được thêm vào.'. Làm thế nào có thể gói này không hoạt động với một bảng hiện có? Tui bỏ lỡ điều gì vậy? Đánh giá cao sự trợ giúp. – codingknob

9

Nếu tên cột khóa chính của bạn là khác hơn là 'id' bạn nên thêm lĩnh vực bổ sung cho rằng mô hình bảng lớp:

class Table(BaseModel): 
    id_field = PrimaryKeyField() 

Điều đó sẽ cho kịch bản của bạn mà bảng có khóa chính lưu trữ trong cột có tên 'id_field' và cột đó là loại INT được bật Tự động tăng. Here là tài liệu mô tả các loại trường trong peewee.

Nếu bạn muốn kiểm soát nhiều hơn trên sân khóa chính của bạn, như đã được trỏ bởi Francis Avila, bạn nên sử dụng primary_key = True luận khi tạo lĩnh vực:

class Table(BaseModel): 
    id_field = CharField(primary_key=True) 

Xem this link trên phi nguyên khóa chính tài liệu

+3

Tác giả của peewee ở đây - câu trả lời của bạn là tại chỗ, cảm ơn! – coleifer

3

Bạn phải cung cấp trường primary_key cho mô hình này. Nếu bảng của bạn không có một trường primary_key duy nhất (giống như của tôi), một số CompositeKey được xác định trong Meta sẽ giúp ích.

primary_key = peewee.CompositeKey('date', 'team') 
+0

Tôi đã cập nhật câu trả lời, bây giờ là rõ ràng.Chỉ cần tìm ra cách tạo một CompositeKey. – ySJ

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