当前位置: 首页 > 面试题库 >

如何在SQLAlchemy中删除表?

祁建明
2023-03-14
问题内容

我想使用SQLAlchemy删除表。

由于我要一遍又一遍地进行测试,因此我想删除该表,my_users以便每次都可以从头开始。

到目前为止,我正在使用SQLAlchemy通过engine.execute()方法执行原始SQL

sql = text('DROP TABLE IF EXISTS my_users;')
result = engine.execute(sql)

但是,我想知道是否有一些标准方法可以做到这一点。我能找到的唯一一个是drop_all(),但是它删除了所有结构,而不仅删除了一个特定的表:

Base.metadata.drop_all(engine)   # all tables are deleted

例如,给出这个非常基本的例子。它由一个带有单个表的SQLite基础结构组成my_users,我在其中添加了一些内容。

from sqlalchemy import create_engine, Column, Integer, String, text
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite://', echo=False)
Base = declarative_base()

class User(Base):
    __tablename__ = "my_users"

    id = Column(Integer, primary_key=True)
    name = Column(String)

    def __init__(self, name):
        self.name = name

# Create all the tables in the database which are
# defined by Base's subclasses such as User
Base.metadata.create_all(engine)

# Construct a sessionmaker factory object
session = sessionmaker()

# Bind the sessionmaker to engine
session.configure(bind=engine)

# Generate a session to work with
s = session()

# Add some content
s.add(User('myname'))
s.commit()

# Fetch the data
print(s.query(User).filter(User.name == 'myname').one().name)

对于这种特定情况,它drop_all()可以工作,但是从我开始拥有多个桌子而又想保留另一个桌子的那一刻起,它就不方便了。


问题答案:

只需drop()针对表对象调用。从文档:

使用给定的Connectable进行连接,为此表发出DROP语句。

在您的情况下,应为:

User.__table__.drop()

如果出现类似以下的异常:

sqlalchemy.exc.UnboundExecutionError: Table object 'my_users' is not

bound to an Engine or Connecthtml" target="_blank">ion. Execution can not proceed without a
database to execute against


您需要传递引擎:

User.__table__.drop(engine)


 类似资料:
  • 问题内容: 我在MySql数据库中有表。这个表有,而且领域。 如何删除某些记录? 现在,我使用以下代码: 但是我不想在删除操作之前进行任何查询。有什么办法吗?我知道,我可以使用,但是我想使用方法。 问题答案: 你可以这样做, 要么 确保作出的生效。

  • 问题内容: 我正在开发使用sqlalchemy 0.6的现有应用程序的扩展。 该应用程序具有以非声明方式创建的sqlalchemy表。我正在尝试在扩展程序中创建一个新表,该表的外键列指向应用程序数据库中主表的主键,并且以声明方式创建它。 这一切都很好,加载扩展程序后就创建了表,一点也没有抱怨。我的表将打印出来,并演示已经添加了新行。我想要并认为可能的(但不知道,因为我从未使用过sql或任何其他数据

  • 问题内容: 我必须缺少SQLAlchemy的层叠选项的琐碎内容,因为我无法获得简单的层叠删除来正确操作-如果删除了父元素,则子对象将使用外键保留。 我在这里放了一个简洁的测试用例: 输出: 父母与子女之间存在简单的一对多关系。该脚本创建一个父级,添加3个子级,然后提交。接下来,它删除父级,但子级仍然存在。为什么?如何使孩子级联删除? 问题答案: 问题是sqlalchemy认为是父级的,因为这是您定

  • 问题内容: 如何使用Flask-SQLAlchemy删除单个表中的所有行? 寻找这样的事情: 问题答案: 尝试: 从文档:

  • 问题内容: 我试图做一个函数来删除我的数据库中带有flask和SQLAlchemy扩展名的记录。问题是,它不仅删除了所有行,而且还删除了所有行。有人可以告诉我我的代码有什么问题吗? 提前致谢! 问题答案: 我怀疑这条线与你的想法不符。 你将获得一个实例(你之前已经做过),并且通过使用它实际上对所有对象发出了一个新查询,而不进行过滤,因此删除了所有对象。 你可能想做的是:

  • 问题内容: 我的模型与模型有关系。我已指定该关系应级联删除操作。但是,当我查询和删除用户时,出现一个错误,指出仍在引用地址行。如何删除用户和地址? 问题答案: 你有以下… 请注意,在“过滤器”之后,您仍然返回Query对象。因此,当您调用时,您正在调用Query对象(而不是User对象)。这意味着您正在执行批量删除(尽管可能只删除了一行) 您正在使用的方法的文档说… 该方法不提供Python中的级