2011-06-28 20 views
54

, motor böyle oluşturulur:SQLAlchemy kullanarak yeni bir veritabanı nasıl oluşturulur? Sqlalchemy ile

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

veritabanı mevcut değilse engine başarısız erişme. Belirtilen veritabanı yoksa SQLAlchemy'ye yeni veritabanı oluşturmasını söylemek mümkün mü?

+2

Yeni bir veritabanı mı yoksa sadece tablo mu oluşturuyorsunuz? Aslında veritabanları oluşturan birçok ORM'ye rastlamadım. –

+4

[this] (http://www.mail-archive.com/[email protected]/msg05520.html) –

+1

Bulamadım: http://sqlalchemy-utils.readthedocs.org/en/latest/database_helpers .html –

cevap

66

Postgre'lerde, varsayılan olarak üç veritabanı normal olarak bulunur. Süper kullanıcı olarak bağlanabiliyorsanız (örneğin, postgres rolü), postgres veya template1 veritabanlarına bağlanabilirsiniz. Varsayılan pg_hba.conf, postgres rolünü kullanmak için yalnızca postgres adlı unix kullanıcısına izin verir, böylece en basit şey sadece o kullanıcı olmaktır. postgres Eğer işlemler içindeki veritabanlarını oluşturmasına izin vermez, çünkü

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

Bununla birlikte engine.execute() kullanamaz ve sqlalchemy daima çalışır: Her halükarda, bir veritabanı oluşturmak için gerekli izinlere sahip bir kullanıcı ile her zamanki gibi bir motoru oluşturmak Bir işlemde sorguları çalıştırmak için Bundan kaçınmak için, motordan yatan bir bağlantı olsun:

>>> conn = engine.connect() 

Ama eğer bir commit açık işlem sona zorunda bağlantı hala bir hareket içinde olacaktır:

>>> conn.execute("commit") 

Ve Daha sonra veritabanı için uygun PostgreSQL komutunu kullanarak oluşturmaya devam edebilirsiniz. Ayrıca

import sqlalchemy 

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

veritabanını görmezden bir yolu yoktur veritabanı var olmadığını emin değilseniz:

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

Bu benim için iyi çalıştı. Bir yan not olarak, conn.execute ('veritabanı DBWithCaps') veritabanını açtığımda, kapakların tanınmamasıyla ilgili sorunlar yaşadım. conn.execute ('drop database' DBWithCaps "')' (tırnak işaretleri ile) iyi çalıştı. – KobeJohn

+0

PostgreSQL'in, alıntı yapılmadıkça küçük harflerle tüm varlıkları beklediğini biliyorum. Dolayısıyla, MyColumn kullanarak bir alan oluşturduysanız, bazı DB'ler bunu mycolumn olarak alır. Başka bir deyişle, tablonuzu nasıl oluşturduğunuzdan emin değilsiniz, ancak tırnak işaretleri kullanılarak oluşturulmuşsa, * büyük/küçük harf duyarlıdır, bu yüzden bir SQL deyimine eriştiğinizde tırnaklara da ihtiyacınız olacaktır. – guyarad

3

O create_engine işlevine isolation_level='AUTOCOMMIT' sağlayarak veritabanını oluştururken manuel işlem yönetimini önlemek mümkündür sqlalchemy.exc.ProgrammingError istisna baskılayarak varlığı nedeniyle oluşturma hatası:

import contextlib 
import sqlalchemy.exc 

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

Bir progres sunucusuna bir veritabanı belirtmeden bağlanamayacaksınız gibi görünüyor, bu nedenle büyük olasılıkla varsayılan "postgres" veritabanına db oluşturma komutlarını çalıştırmak için bağlanmak isteyeceksiniz, aksi takdirde varsayılana bağlanmayı deneyecektir " kullanıcı "veritabanı ve mevcut değilse şikayet. – Acorn

52

Bkz

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))