【问题标题】:Flask-SQLAlchemy check if table exists in databaseFlask-SQLAlchemy 检查数据库中是否存在表
【发布时间】:2017-03-31 21:06:32
【问题描述】:

Flask-SQLAlchemy 检查数据库中是否存在表。 我看到类似的问题,但我尽量不成功。

Flask-SQLAlchemy check if row exists in table

我已经创建了一个表对象,如下所示:

<class'flask_sqlalchemy.XXX'>,

现在如何检查对象是否存在于数据库中。

我做了很多尝试: 例如:

   for t in db.metadata.sorted_tables:
            print("tablename",t.name)

之前创建了一些表对象,但它不存在于数据库中,现在它们。所有打印。 eg:打印内容为

tablename: table_1
tablename: table_2
tablename: table_3

但是只有table_1存在datable,table_2和table_3是动态创建的,现在我只想使用table_1。

非常感谢。

【问题讨论】:

标签: python database flask sqlalchemy


【解决方案1】:

SQL Alchemy 推荐的检查表是否存在的方法是创建一个检查器对象并使用其has_table() 方法。 以下示例是从 sqlalchemy.engine.reflection.Inspector.has_table 复制而来,并添加了一个 SQLite 引擎(在内存中)以使其可重现:

In [17]: from sqlalchemy import create_engine, inspect
    ...: from sqlalchemy import MetaData, Table, Column, Text
    ...: engine = create_engine('sqlite://')
    ...: meta = MetaData()
    ...: meta.bind = engine
    ...: user_table = Table('user', meta, Column("first_name", Text))
    ...: user_table.create()
    ...: inspector = inspect(engine)
    ...: inspector.has_table('user')
Out[17]: True

您还可以使用user_table 元数据元素name 来检查它是否存在:

inspector.has_table(user_table.name)

【讨论】:

    【解决方案2】:

    我使用了这些方法。像您一样查看模型只会告诉您数据库中应该包含什么。

    import sqlalchemy as sa
    
    def database_is_empty():
        table_names = sa.inspect(engine).get_table_names()
        is_empty = table_names == []
        print('Db is empty: {}'.format(is_empty))
        return is_empty
    
    def table_exists(name):
        ret = engine.dialect.has_table(engine, name)
        print('Table "{}" exists: {}'.format(name, ret))
        return ret
    

    可能还有比这更简单的方法:

    def model_exists(model_class):
        engine = db.get_engine(bind=model_class.__bind_key__)
        return model_class.metadata.tables[model_class.__tablename__].exists(engine)
    

    【讨论】:

    • 注意:engine 引用未定义
    • Notev2:engine参考可以从SQLAlchemy()获得。同时导入from flask_sqlalchemy import SQLAlchemy
    • Table.exists() 方法自 1.4 版起已被弃用
    • @ZobayerHasan 提及替换它的内容可能很有用。
    • dialect.has_table()的文档说“这个方法是SQLAlchemy内部使用的,发布出来是为了让第三方方言可以提供一个实现。不是 用于检查表是否存在的公共 API。请使用 Inspector.has_table() 方法。"
    猜你喜欢
    • 2016-01-01
    • 2017-11-22
    • 2019-04-12
    • 2014-07-27
    • 2017-05-11
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    相关资源
    最近更新 更多