使用SQLAlchemy创建引擎对象,如下所示:
from sqlalchemy import create_engine
engine = create_engine("postgresql://localhost/mydb")
访问engine
参数中指定的数据库将失败create_engine
(在这种情况下,mydb
)不存在。如果指定的数据库不存在,是否可以告诉SQLAlchemy创建一个新数据库?
发布于 2012-01-24 03:01:11
在 postgres 上,默认情况下通常存在三个数据库。如果您能够以超级用户身份(例如 postgres
角色)进行连接,那么您可以连接到 postgres
或 template1
数据库。默认的 pg_hba.conf 只允许名为 postgres
的 unix 用户使用 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()
发布于 2015-06-22 09:45:12
SQLAlchemy-Utils为SQLAlchemy提供自定义数据类型和各种实用程序函数。您可以使用pip安装最新的官方版本:
pip install sqlalchemy-utils
Thedatabase helpers包括一个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))
发布于 2015-03-01 00:55:26
可以在创建数据库时避免手动事务管理,方法是提供
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
https://stackoverflow.com/questions/6506578
复制相似问题