我想使用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中的级