23

我需要用 python sqlalchemy 编写一个脚本来搜索数据库是否存在,如果数据库存在,它应该查询数据库,否则创建数据库和表。

伪代码:

   if db exists cursor.execute(sql)
   else
      create db test;
      create tables;
      insert data;
4

7 回答 7

23

您可以使用该方法,如果数据库不存在,该sqlalchemy.engine.base.Engine.connect()方法将引发 a 。OperationalError

import sqlalchemy as sqla
from sqlalchemy import create_engine
from sqlalchemy.exc import OperationalError
db = sqla.create_engine(database_uri)
try:
    db.connect()
    db.execute(sql)
except OperationalError:
    # Switch database component of the uri
    default_database_uri = os.path.join(os.path.dirname(
                           str(db.engine.url)), 'mysql')
    db = sqla.create_engine(default_database_uri)
    # Create your missing database/tables/data here
    # ...
于 2014-03-19T11:24:46.477 回答
21

如果您不介意导入其他库,另一种方法是使用 sqlalchemy_utils。然后database_exists做你所期望的,你可以通过 sqlalchemy 数据库 uri。

if database_exists('sqllite:////tmp/test.db'):
    do_stuff_with_db(db)

http://sqlalchemy-utils.readthedocs.org/en/latest/database_helpers.html

于 2015-01-27T23:29:58.817 回答
4

我不知道规范的方法是什么,但这是一种通过检查数据库列表来检查数据库是否存在的方法。

from sqlalchemy import create_engine

# This engine just used to query for list of databases
mysql_engine = create_engine('mysql://{0}:{1}@{2}:{3}'.format(user, pass, host, port))

# Query for existing databases
existing_databases = mysql_engine.execute("SHOW DATABASES;")
# Results are a list of single item tuples, so unpack each tuple
existing_databases = [d[0] for d in existing_databases]

# Create database if not exists
if database not in existing_databases:
    mysql_engine.execute("CREATE DATABASE {0}".format(database))
    print("Created database {0}".format(database))

# Go ahead and use this engine
db_engine = create_engine('mysql://{0}:{1}@{2}:{3}/{4}'.format(user, pass, host, port, db))

如果您不需要知道数据库是否已创建,这是另一种方法。

from sqlalchemy import create_engine

# This engine just used to query for list of databases
mysql_engine = create_engine('mysql://{0}:{1}@{2}:{3}'.format(user, pass, host, port))

# Query for existing databases
mysql_engine.execute("CREATE DATABASE IF NOT EXISTS {0} ".format(database))

# Go ahead and use this engine
db_engine = create_engine('mysql://{0}:{1}@{2}:{3}/{4}'.format(user, pass, host, port, db))
于 2016-02-25T01:26:15.343 回答
3

创建一个连接到数据库并执行通用查询的引擎,例如SELECT 1;. 如果失败,您可以创建数据库。但是,如何创建新数据库取决于 DBMS。

使用 PostgreSQL,您将连接到postgres数据库并发出一条CREATE DATABASE语句,然后连接到新创建的数据库。

于 2013-02-26T09:33:47.530 回答
1

您可以使用https://sqlalchemy-utils.readthedocs.io/en/latest/ 有一个名为database_exists()的助手

于 2020-04-17T16:46:31.070 回答
0

如果您决定使用 sqlalchemy_utils,请确保将 connect_args 作为查询字符串应用。database_exists否则,当函数重新创建 sqlalchemy 引擎时,这些参数将不会被保留

from sqlalchemy import create_engine
from sqlalchemy_utils import database_exists

connect_args = {'charset': 'utf8'}
connect_args['ssl_cert'] = 'certs/client-cert.pem'
connect_args['ssl_key'] = 'certs/client-key.pem'
connect_args['ssl_ca'] = 'certs/server-ca.pem'

engine = create_engine(os.environ['MYSQL_CONN_URL'] + '/' + os.environ['DB_NAME'] + '?' +  urlencode(connect_args))
print(database_exists(engine.url))
于 2020-05-08T19:05:38.533 回答
0

安装 pip 包

pip install sqlalchemy_utils

检查 database_exists

from sqlalchemy import create_engine
from sqlalchemy_utils import database_exists

engine = create_engine('postgresql://postgres@localhost/name')
database_exists(engine.url)
于 2020-11-09T18:35:27.827 回答