2012-03-15 51 views
7

Tôi đang sử dụng SQLAlchemy 0.6.3 với PostgreSQL 8.4 trên Debian squeeze. Tôi muốn một bảng nơi một cột lưu trữ một cái gì đó trong PostgreSQL hiển thị trong Python như là một danh sách các danh sách số nguyên hoặc bộ dữ liệu của các bộ nguyên. Ví dụ.Các mảng đa chiều PostgreSQL trong SQLAlchemy

((1,2), (3,4), (5,6,7)) 

Trong ví dụ bên dưới cột đó là model. Tôi nghĩ rằng một cách tiếp cận hợp lý có thể là để lưu trữ các công cụ như một bảng PG 2 chiều, mà trong PG trông giống như integer[][]. Tôi không biết ở dạng nào SQLA sẽ trả về điều này cho Python, nhưng tôi hy vọng nó giống như một bộ tuple.

Tuy nhiên, tôi không thể tìm ra cách để cho SQLA cung cấp cho tôi mảng Integer hai chiều. documentation cho sqlalchemy.dialects.postgresql.ARRAY nói

item_type - Kiểu dữ liệu của các mục của mảng này. Lưu ý rằng kích thước không liên quan ở đây, vì vậy mảng đa chiều như INTEGER [] [], được tạo thành ARRAY (Số nguyên), không phải là ARRAY (ARRAY (Số nguyên)) hoặc như vậy. Các loại hình lập bản đồ con số trên bay.

Thật không may, tôi không biết điều đó có nghĩa là gì. Làm thế nào để ánh xạ kiểu có thể phát hiện ra điều này khi đang bay? Nó cần phải tạo DDL đúng. Dự đoán đầu tiên và duy nhất của tôi về cách thực hiện điều này sẽ là ARRAY(ARRAY(Integer)). Hiện nay tôi có

crossval_table = Table(
     name, meta, 
     Column('id', Integer, primary_key=True), 
     Column('created', TIMESTAMP(), default=now()), 
     Column('sample', postgresql.ARRAY(Integer)), 
     Column('model', postgresql.ARRAY(Integer)), 
     Column('time', Float), 
     schema = schema, 

Điều này tạo ra DDL sau

CREATE TABLE crossval (
    id integer NOT NULL, 
    created timestamp without time zone, 
    sample integer[], 
    model integer[], 
    "time" double precision 
); 

bị lỗi, tất nhiên. Tôi đang thiếu gì?

+0

Nếu bạn định làm nhiều việc như thế thì bạn có thể sẽ không xem xét thời tiết một db quan hệ là lựa chọn tốt nhất cho bạn. – Mark

+0

@Mark: Tôi không theo dõi. Rất nhiều thứ như thế nào? –

+0

Nếu bạn đang cố gắng tồn tại rất nhiều mảng hoặc bản đồ của bản đồ, bạn có thể không xem xét cơ sở dữ liệu hỗ trợ khái niệm đó như lớp 1, ví dụ: redis – Mark

Trả lời

3

Tôi trả lời câu hỏi này tại đây, vì Mike Bayer đã trả lời câu hỏi này trên người dùng sqlalchemy.

Xem thread trên người dùng sqlalchemy, nơi Mike Bayer trả lời câu hỏi này. Khi Mike làm rõ, và như tôi đã bỏ lỡ khi đọc tài liệu PG, PG không thực sự thực thi kích thước mảng, cũng như không thực hiện SQLA. Vì vậy, người ta có thể viết integer[][], nhưng PG không đối xử với bất kỳ cách nào khác với integer[]. Đặc biệt, cả PG và SQLA sẽ chấp nhận một biểu thức mảng của bất kỳ thứ nguyên nào. Tôi không chắc tại sao lại như vậy. Được trích dẫn bởi Mike, số PG Arrays documentation nói

Việc triển khai hiện tại cũng không thực thi số được khai báo là thứ nguyên.Mảng của một loại phần tử cụ thể là tất cả được coi là cùng loại, bất kể kích thước hoặc số lượng của các kích thước . Vì vậy, việc khai báo kích thước mảng hoặc số thứ nguyên trong TẠO TẠO chỉ đơn giản là tài liệu; nó không ảnh hưởng đến hoạt động thời gian chạy.

Xem thêm số ticket mà anh ta đã mở. Có vẻ như đây là để thực thi các thứ nguyên ở cấp độ SQLA.

4

Tôi cố gắng này

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 

engine = create_engine('postgresql://:5432/test', echo=True) 

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.dialects import postgresql 

Base = declarative_base() 


from sqlalchemy import Column, Integer, String 

class User(Base): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    sample = Column(postgresql.ARRAY(Integer)) 


Base.metadata.create_all(engine) 

Session = sessionmaker(engine) 
s = Session() 

a = User() 
a.name='test' 
a.sample = [[1,2], [3,4]] 
s.add(a) 
s.commit() 

Tôi nghĩ rằng đây sẽ giải quyết vấn đề của bạn. Bởi vì trong số doc, chúng đề cập đến.

Tuy nhiên, triển khai hiện tại bỏ qua bất kỳ giới hạn kích thước mảng được cung cấp nào, tức là hành vi cũng giống như đối với các mảng có độ dài không xác định.

Vì vậy, nếu bạn không khai báo bất cứ điều gì thì đó sẽ là mảng mà bạn muốn.

+0

Xin chào Lafada. Bạn đã ở trong sân chơi bóng bên phải, nhưng trích dẫn một đoạn tài liệu sai. Vấn đề là về kích thước, không phải giới hạn kích thước mảng. Xem cập nhật của tôi ở trên. Vì bạn là người duy nhất trả lời, nếu bạn sửa câu trả lời của mình, tôi sẽ chấp nhận nó. :-) –

+0

Bạn cần khai báo 'integer [] []' thay vì 'integer []' bởi sqlalchemy. Nhưng bây giờ nó ra khỏi kiến ​​thức của tôi cho sqlalchemy :). – Nilesh

+0

Rất tiếc, tôi không theo dõi nhận xét này. –