2012-08-02 32 views
5

Chúng tôi đang sử dụng tính năng tự động tải của sqlalchemy để lập bản đồ cột để ngăn mã hóa cứng trong mã của chúng tôi.sqlalchemy tự động tải về hoặc tồn tại lâu dài

class users(Base): 
    __tablename__ = 'users' 
    __table_args__ = { 
     'autoload': True, 
     'mysql_engine': 'InnoDB', 
     'mysql_charset': 'utf8' 
    } 

Có cách nào để serialize hoặc bộ nhớ cache tự động nạp siêu dữ liệu/orms vì vậy chúng tôi không cần phải đi qua quá trình tự động load mỗi lần chúng tôi cần phải tham khảo các lớp học orm của chúng tôi từ các kịch bản khác/chức năng?

Tôi đã xem xét bộ nhớ đệm và cốc sữa nhưng không tìm thấy câu trả lời rõ ràng nếu có thể hoặc cách thực hiện.

Lý tưởng nhất là chúng tôi chạy kịch bản lập bản đồ autload chỉ khi chúng ta đã cam kết thay đổi cấu trúc cơ sở dữ liệu của chúng tôi nhưng tham khảo một tổ chức phi autoload/dai dẳng phiên bản/cache của bản đồ cơ sở dữ liệu của chúng tôi từ khắp nơi scripts/chức năng khác,

Bất kỳ ý tưởng?

+0

Tại sao bạn không làm theo cách khác xung quanh: xác định mô hình thổi hoàn toàn trong SA. Như một tác dụng phụ, điều này sẽ hoạt động như kiểm soát nguồn của bạn cho lược đồ cơ sở dữ liệu. * Tất nhiên, điều này chỉ hoạt động nếu ứng dụng SA của bạn có quyền kiểm soát chính của (các) cơ sở dữ liệu mà bạn đang làm việc với * – van

+0

phát triển cơ sở dữ liệu được xử lý riêng trong trường hợp của tôi, nghĩa là ứng dụng sẽ không kiểm soát toàn bộ. Tuy nhiên, tôi đã tìm ra cách để chọn siêu dữ liệu nên tôi chỉ cần phản ánh qua kết nối cơ sở dữ liệu một lần để tạo ra dưa chua, thời gian tôi sử dụng dữ liệu meta được chọn để phản ánh việc mất một phần nhỏ thời gian thông qua kết nối db (xem bên dưới). – user1572502

Trả lời

5

Điều tôi đang làm bây giờ là chọn siêu dữ liệu sau khi chạy phản chiếu thông qua kết nối cơ sở dữ liệu (MySQL) và sau khi sử dụng dưa chuột có siêu dữ liệu được chọn để phản ánh trên lược đồ với siêu dữ liệu được liên kết với một công cụ SQLite.

cachefile='orm.p' 
dbfile='database' 
engine_dev = create_engine(#db connect, echo=True) 
engine_meta = create_engine('sqlite:///%s' % dbfile,echo=True) 
Base = declarative_base() 
Base.metadata.bind = engine_dev 
metadata = MetaData(bind=engine_dev) 

# load from pickle 
try: 
    with open(cachefile, 'r') as cache: 
     metadata2 = pickle.load(cache) 
     metadata2.bind = engine_meta 
     cache.close() 
    class Users(Base): 
     __table__ = Table('users', metadata2, autoload=True) 

    print "ORM loaded from pickle" 

# if no pickle, use reflect through database connection  
except: 
    class Users(Base): 
     __table__ = Table('users', metadata, autoload=True) 

print "ORM through database autoload" 

# create metapickle 
metadata.create_all() 
with open(cachefile, 'w') as cache: 
    pickle.dump(metadata, cache) 
    cache.close() 

Bất kỳ nhận xét nào nếu điều này ổn (nó hoạt động) hoặc có điều gì đó tôi có thể cải thiện?

+2

bạn có thể đơn giản hóa việc này chỉ để sử dụng một đối tượng MetaData và cũng chỉ cần thực hiện một "if os.path.exists (cachefile)" đơn giản để xác định xem bạn có đang bỏ chọn hay không. "Bảng ('người dùng', siêu dữ liệu, tự động tải = True)" và như vậy chỉ cần được tuyên bố một lần kể từ khi bạn đã nhìn thấy nó bỏ qua sự phản ánh nếu bảng đã có trong MetaData. – zzzeek

+1

Tôi nghĩ rằng không cần phải đóng một tệp khi được sử dụng bên trong câu lệnh 'with', nhưng điều đó không liên quan. Cách tiếp cận của bạn có vẻ thú vị, nó có hoạt động như mong đợi không? – jadkik94

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