2009-09-02 6 views
0

그래서 내 디자인은 각 "프로젝트"에 대해 별도의 SQLite 파일을 요구합니다. SQLAlchemy 풀링 문서를 통해주의 깊게 읽습니다. 지금 내 생각에 바보가되고 싶지 않습니다. 풀링과 함께,하지만 이것은 실제로 각 프로젝트에 대한 별도의 연결 엔진입니다.SQLAlchemy 연결, 풀링 및 SQLite

그런 경우 엔진을 만들 때 규칙에 따라 명명 된 파일에 연결하거나 새 SQLite 파일을 만들고 스키마 템플릿을 제공하십시오.

답변

2

흠, 무엇? 연결 풀은 동일한 (데이터베이스) 서버에 대한 많은 연결을 포함합니다. 새로운 연결을 설정하는 데 시간이 걸리므로, 많은 수명이 짧은 프로세스을 사용하면 동일한 데이터베이스를 사용하기 때문에 이미 설정된 연결 풀을 갖는 것이 좋습니다. 프로세스는 새로운 연결을 열 때 대기하지 않고 연결을 체크 아웃하고, 작업을 수행하고, 리턴 할 수 있습니다. 어떤 경우

은, 모든 연결은 URI에 의해 주어진 동일한 데이터베이스로 이동이 create_engine

1

첫째, 일부 어휘에 전달. SQLAlchemy는 MetaData 개체 (테이블 및 기타 데이터베이스 엔터티를 나타내는 개체 포함)가있는 스키마를 정의합니다. 메타 데이터 개체는 "엔진"으로 바운드 될 수 있으며 "풀"로 생각할 수도 있습니다.

표준 스키마를 작성하고 여러 데이터베이스를 사용하려면 하나 메타 데이터를 객체를 생성하고 연결할 데이터베이스 인 여러 엔진, 각각의 엔진을 사용하고 싶을 것이다. 다음은 대화식 iPython 프롬프트의 예제입니다. 이 SQLite 엔진은 각각 다른 메모리 내 데이터베이스에 연결됩니다. 연결 1과 연결 2는 동일한 데이터베이스에 연결하지 마십시오 :

In [1]: from sqlalchemy import * 
In [2]: metadata = MetaData() 
In [3]: users_table = Table('users', metadata, 
    ...:      Column('id', Integer, primary_key=True), 
    ...:      Column('name', String)) 
In [4]: connection1 = create_engine('sqlite:///:memory:') 
In [5]: connection2 = create_engine('sqlite:///:memory:') 

In [6]: ## Create necessary tables 
In [7]: metadata.create_all(bind=connection1) 
In [8]: metadata.create_all(bind=connection2) 

In [9]: ## Insert data 
In [10]: connection1.execute(
      users_table.insert(values={'name': 'Mike'}, bind=connection1)) 
In [11]: connection2.execute(
      users_table.insert(values={'name': 'Jim'}, bind=connection2)) 

In [12]: print connection1.execute(users_table.select(bind=connection1)).fetchall() 
[(1, u'Mike')] 

In [13]: print connection2.execute(users_table.select(bind=connection2)).fetchall() 
[(1, u'Jim')] 

당신이 볼 수 있듯이, 나는이 SQLite 데이터베이스에 연결하고 내 metedata 객체에 저장된 공통 스키마를 사용하여 각 문을 실행. 내가 너라면, 나는 create_engine 메소드를 사용하고 풀링에 대해 걱정하지 않아도된다. 최적화 할 시간이되면 create_engine에 대한 인수를 사용하여 데이터베이스 연결 방법을 조정할 수 있습니다.