SQLAlchemy를 사용하여 새 데이터베이스를 만드는 방법은 무엇입니까?
SQLAlchemy를 사용하면 다음과 같이 Engine 개체가 생성됩니다.
from sqlalchemy import create_engine
engine = create_engine("postgresql://localhost/mydb")
engine
인수에 지정된 데이터베이스 create_engine
(이 경우 mydb
)가 없으면 액세스 가 실패 합니다. 지정된 데이터베이스가없는 경우 SQLAlchemy에 새 데이터베이스를 만들도록 지시 할 수 있습니까?
postgres에서는 일반적으로 세 개의 데이터베이스가 기본적으로 존재합니다. 수퍼 유저 (예 : postgres
역할)로 연결할 수있는 경우 postgres
또는 template1
데이터베이스에 연결할 수 있습니다 . 기본 pg_hba.conf는 이름이 지정된 유닉스 사용자 만 역할 postgres
을 사용하도록 허용 postgres
하므로 가장 간단한 방법은 해당 사용자가되는 것입니다. 어쨌든 데이터베이스를 만들 권한이있는 사용자로 평소와 같이 엔진을 만듭니다.
>>> engine = sqlalchemy.create_engine("postgres://postgres@/postgres")
engine.execute()
그러나 postgres는 트랜잭션 내부에 데이터베이스를 만들 수 없으며 sqlalchemy는 항상 트랜잭션에서 쿼리를 실행하려고하기 때문에 사용할 수 없습니다 . 이 문제를 해결하려면 엔진에서 기본 연결을 가져옵니다.
>>> conn = engine.connect()
그러나 연결은 여전히 트랜잭션 내부에 있으므로 다음을 사용하여 열린 트랜잭션을 종료해야합니다 commit
.
>>> conn.execute("commit")
그런 다음 적절한 PostgreSQL 명령을 사용하여 데이터베이스 생성을 진행할 수 있습니다.
>>> conn.execute("create database test")
>>> conn.close()
SQLAlchemy-Utils 는 SQLAlchemy에 대한 사용자 지정 데이터 유형 및 다양한 유틸리티 함수를 제공합니다. pip를 사용하여 최신 공식 버전을 설치할 수 있습니다.
pip install sqlalchemy-utils
데이터베이스 헬퍼는 포함 create_database
기능 :
from sqlalchemy import create_engine
from sqlalchemy_utils import database_exists, create_database
engine = create_engine("postgres://localhost/mydb")
if not database_exists(engine.url):
create_database(engine.url)
print(database_exists(engine.url))
다음 기능 을 제공 isolation_level='AUTOCOMMIT'
하여 데이터베이스를 생성하는 동안 수동 트랜잭션 관리를 피할 수 create_engine
있습니다.
import sqlalchemy
with sqlalchemy.create_engine(
'postgresql:///postgres',
isolation_level='AUTOCOMMIT'
).connect() as connection:
connection.execute('CREATE DATABASE my_database')
또한 데이터베이스가 존재하지 않는지 확실하지 않은 경우 sqlalchemy.exc.ProgrammingError
예외 를 억제하여 존재로 인한 데이터베이스 생성 오류를 무시하는 방법이 있습니다 .
import contextlib
import sqlalchemy.exc
with contextlib.suppress(sqlalchemy.exc.ProgrammingError):
# creating database as above
참고 URL : https://stackoverflow.com/questions/6506578/how-to-create-a-new-database-using-sqlalchemy
'program story' 카테고리의 다른 글
Android는 SQLite의 데이터베이스 버전을 어디에 저장합니까? (0) | 2020.09.09 |
---|---|
Django 관리자 : 모델에서 editable = False '로 표시된 필드를 표시하는 방법은 무엇입니까? (0) | 2020.09.09 |
"인수 목록이 너무 길다"는 경우 3 일이 지난 모든 파일을 삭제하는 방법은 무엇입니까? (0) | 2020.09.09 |
Swift 하위 클래스 UIView (0) | 2020.09.09 |
요소를 효율적으로 검색하는 방법 (0) | 2020.09.09 |