2012-02-15 43 views
5

Tôi đang sử dụng cơ sở dữ liệu hiện có được thực hiện bởi một bên thứ ba với sqlalchemy. Tuy nhiên, tôi gặp rắc rối vì các bảng không có các khóa primar, và những gì tệ hơn, chúng có các phần tử trùng lặp cho mỗi hàng, vì vậy tôi không thể chọn một cột hiện có làm khóa chính. Các bảng có hai cột: cả hai đều có giá trị không phải là duy nhất.Python sqlalchemy: bảng không có khóa chính và giá trị trùng lặp?

Tôi cố gắng để con khỉ-vá bảng như mỗi http://www.blog.pythonlibrary.org/2010/09/10/sqlalchemy-connecting-to-pre-existing-databases/ nhưng dường như điều này không làm việc (xem dưới đây)

mã hiện tại của tôi là (MirnaTable là lớp ánh xạ của tôi, về cơ bản chỉ là một bộ xương với không có gì khác)

connection = create_engine("sqlite:///targets.sqlite") 
metadata = MetaData(bind=connection) 
db_table = Table("miranda", metadata, 
       Column("id", Integer, primary_key=True), 
       autoload=True) 
mapper(MirnaTable, db_table) 
Session = sessionmaker(connection) 
session = Session() 

Sau đó, tôi thử ví dụ ban hành

all_records = session.query(MirnaTable).all() 

Và tôi nhận

sqlalchemy.exc.OperationalError: (OperationalError) no such column: miranda.id 
u'SELECT miranda.gene_id AS miranda_gene_id, miranda."mature_miRNA" AS 
"miranda_mature_miRNA", miranda.id AS miranda_id \nFROM miranda'() 

Vì vậy, tất nhiên không tìm thấy cột id. Bất kỳ ý tưởng về những gì tôi đang làm sai? Cảm ơn trước.

EDIT: Theo yêu cầu, đây là một ví dụ từ bảng (lấy trực tiếp từ sqlite):

gene mature_miRNA 
---- ------------- 
80205 hsa-miR-200c 
80205 hsa-miR-200c 
9693 hsa-miR-200c 
9693 hsa-miR-200c 
9881 hsa-miR-200c 
9710 hsa-miR-200c 
9750 hsa-miR-200c 
+0

Bạn có thể đăng bảng với dữ liệu ví dụ xin vui lòng ? – JackalopeZero

+0

Xong: có một mẫu về loại dữ liệu bạn có thể mong đợi bây giờ. – Einar

+0

ORM sẽ không hoạt động nếu không có thứ gì đó có thể phục vụ như một danh tính của hàng. Xem xét sử dụng bảng trực tiếp mà không cần ánh xạ nó vào lớp. –

Trả lời

6

Bạn đã hiểu sai bài đăng mà bạn đề cập đến. Bạn phải chọn một cột hiện tại và xác định cột đó là chính. Cũng có thể thiết lập khóa chính kết hợp bằng cách đặt tất cả chúng trong định nghĩa. Trong trường hợp của bạn, tôi nghĩ rằng một gen có một số microRNA trưởng thành, vì vậy khóa chính có thể bao gồm cặp (gene_id, mature_miRNA). Vì không có thêm các trường trong bảng, không cần có cờ autoload=True.

db_table = Table("miranda", metadata, 
       Column("gene_id", Integer, primary_key=True), 
       Column("mature_miRNA", Integer, primary_key=True)) 

Tôi không biết loại trường trong bảng của bạn, vì vậy hãy thay đổi chúng một cách thích hợp nếu chúng không phải là số nguyên.

+0

Nó hoạt động, tuyệt vời. Tôi đặt các loại cho phù hợp và bây giờ tôi nhận được kết quả chính xác (so với một truy vấn chuẩn sử dụng sqlite3). – Einar

+0

Theo dữ liệu cập nhật của bạn trong câu hỏi, các cặp này không phải là duy nhất, vì vậy chúng không thể phục vụ như là khóa chính. Một số phần của ORM giống như các truy vấn đơn giản hoạt động, một số phần khác có thể bị lừa với tải lại bị vô hiệu hóa. Nhưng đừng nghĩ rằng mọi thứ sẽ hoạt động. –

+0

Tôi chủ yếu sử dụng bình đẳng và IN (nó là một trường hợp sử dụng thực sự đơn giản), nhưng tôi sẽ làm một số xét nghiệm chính xác chỉ trong trường hợp. – Einar

0

Hãy chắc chắn rằng cột id tồn tại trước hết và sau đó rằng bạn đã thử cả hai trường hợp trên và dưới .

Nó cũng có thể thiết lập hai khóa chính cho bảng:

Column("id", Integer, primary_key=True), 
Column("secondColumn", Integer, primary_key=True) 

Tuy nhiên điều này có thể gây ra bản cập nhật bất thường nếu có hàng khác phù hợp với dòng này chính xác. Bạn có thể tái tạo bảng tốt nhất và chèn cột PK của riêng bạn

+0

tôi có thể làm điều đó nhưng tôi muốn cố gắng tránh điều này, vì nó xuất phát từ một bên thứ ba và nó sẽ có nghĩa forking một cơ sở dữ liệu như vậy với tất cả những vấn đề mà esue. Ngoài ra, cả hai cột (exept một trong tôi cố gắng để khỉ vá trong) có giá trị trùng lặp (có, một mớ hỗn độn, nhưng tôi đã không làm điều đó ...). EDIT: Quên để nói, cột "id" không tồn tại. Tôi theo ví dụ được liên kết trong câu hỏi để khỉ vá bảng (nhưng nó không hoạt động). – Einar

0

Thay đổi Column id để rowid cho cơ sở dữ liệu SQLite

gốc:

db_table = Table("miranda", metadata, 
       Column("id", Integer, primary_key=True), 
       autoload=True) 

sửa đổi:

db_table = Table("miranda", metadata, 
       Column("rowid", Integer, primary_key=True), 
       autoload=True) 
Các vấn đề liên quan