2011-06-28 73 views
54

Với SQLAlchemy, động cơ được tạo ra như thế này:Làm thế nào để tạo một cơ sở dữ liệu mới bằng cách sử dụng SQLAlchemy?

from sqlalchemy import create_engine 
engine = create_engine("postgresql://localhost/mydb") 

Truy cập engine thất bại nếu cơ sở dữ liệu là không có mặt. Có thể nói SQLAlchemy để tạo cơ sở dữ liệu mới nếu cơ sở dữ liệu được chỉ định không tồn tại?

+2

Tạo cơ sở dữ liệu mới hoặc chỉ bảng? Tôi đã không gặp nhiều ORM mà thực sự tạo ra cơ sở dữ liệu. –

+4

Tôi đã tìm thấy [this] (http://www.mail-archive.com/[email protected]/msg05520.html) –

+1

Có ích: http://sqlalchemy-utils.readthedocs.org/en/latest/database_helpers .html –

Trả lời

66

Trên mặt sau, ba cơ sở dữ liệu thường được hiển thị theo mặc định. Nếu bạn có thể kết nối với tư cách là siêu người dùng (ví dụ: vai trò postgres), thì bạn có thể kết nối với cơ sở dữ liệu postgres hoặc template1. Pg_hba.conf mặc định chỉ cho phép người dùng Unix có tên postgres sử dụng vai trò postgres, vì vậy điều đơn giản nhất là chỉ trở thành người dùng đó. Dù sao đi nữa, tạo ra một động cơ như bình thường với một người dùng nào có quyền truy cập để tạo ra một cơ sở dữ liệu:

>>> engine = sqlalchemy.create_engine("postgres://[email protected]/postgres") 

Bạn không thể sử dụng engine.execute() Tuy nhiên, bởi vì postgres không cho phép bạn tạo ra các cơ sở dữ liệu bên trong các giao dịch, và SQLAlchemy luôn cố gắng để chạy truy vấn trong một giao dịch. Để làm được việc này, có được kết nối tiềm ẩn từ động cơ:

>>> conn = engine.connect() 

Nhưng kết nối vẫn sẽ được bên trong một giao dịch, vì vậy bạn phải kết thúc giao dịch mở với một commit:

>>> conn.execute("commit") 

Và sau đó bạn có thể tiến hành tạo cơ sở dữ liệu bằng cách sử dụng lệnh PostgreSQL thích hợp cho nó.

>>> conn.execute("create database test") 
>>> conn.close() 
+2

Điều này làm việc tốt cho tôi. Như một lưu ý phụ, khi tôi đã làm 'conn.execute ('drop database DBWithCaps')' Tôi đã có vấn đề với nó không nhận ra mũ. 'conn.execute ('drop database" DBWithCaps "')' (với dấu ngoặc kép) hoạt động tốt. – KobeJohn

+0

Tôi biết rằng PostgreSQL hy vọng tất cả các thực thể trong trường hợp thấp hơn, trừ khi được trích dẫn. Vì vậy, nếu bạn đã tạo một trường bằng cách sử dụng MyColumn, một số DB sẽ lấy nó làm cột màu của tôi. Nói cách khác, không chắc chắn cách bạn tạo bảng của bạn, nhưng nếu nó được tạo ra bằng cách sử dụng dấu ngoặc kép, nó * sẽ * phân biệt chữ hoa chữ thường, vì vậy khi bạn truy cập nó trong câu lệnh SQL, bạn cũng cần báo giá. – guyarad

3

Có thể tránh quản lý giao dịch thủ công khi tạo cơ sở dữ liệu bằng cách cung cấp isolation_level='AUTOCOMMIT'-create_engine chức năng:

import sqlalchemy 

with sqlalchemy.create_engine(
    'postgresql:///postgres', 
    isolation_level='AUTOCOMMIT' 
).connect() as connection: 
    connection.execute('CREATE DATABASE my_database') 

Ngoài ra nếu bạn không chắc chắn rằng cơ sở dữ liệu không tồn tại có một cách để bỏ qua cơ sở dữ liệu lỗi tạo do tồn tại bằng cách ngăn chặn sqlalchemy.exc.ProgrammingError ngoại lệ:

import contextlib 
import sqlalchemy.exc 

with contextlib.suppress(sqlalchemy.exc.ProgrammingError): 
    # creating database as above 
+0

Có vẻ như bạn không thể kết nối với máy chủ progres mà không chỉ định cơ sở dữ liệu, vì vậy bạn có thể muốn kết nối với cơ sở dữ liệu "postgres" mặc định để thực hiện lệnh tạo db, nếu không nó sẽ cố gắng kết nối với mặc định " người dùng "cơ sở dữ liệu và khiếu nại nếu nó không tồn tại. – Acorn

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