gpt4 book ai didi

python - 删除未级联到sqlalchemy中的表

转载 作者:太空狗 更新时间:2023-10-30 02:05:48 25 4
gpt4 key购买 nike

我正在开发一个使用 sqlalchemy 0.6 的现有应用程序的扩展。

该应用程序具有以非声明方式创建的 sqlalchemy 表。我正在尝试在我的扩展中创建一个新表,其中的外键列指向应用程序数据库中主表的主键,并且我正在以声明方式创建它。

这一切工作正常,一旦加载扩展就创建了表,并且没有任何提示。我的表格打印出来并显示新行已添加成功。我想要和认为可能的(但不知道,因为我从未使用过 sql 或任何其他数据库)是当删除应用程序主表中具有相应外键的行时删除表中的相应行.

到目前为止,已经尝试了许多排列,但没有任何效果。我认为使用 backref 集和使用 delete 定义的关系被级联,应该没有问题。因为新表是在应该只是插件的扩展中定义的,所以我根本不想在主应用程序中编辑代码,至少这是我的目标。但是,我遇到的问题之一是我要引用的主应用程序表在其类中没有定义成员变量,没有在其映射器中声明其主键,并且仅在表中声明了主键.这使得很难创建一个 relation(ship) 子句,它的第一个参数必须是一个类或映射器(在这种情况下,它们都没有声明主键)。有什么办法可以实现吗?

ps - 这是我正在使用的一些代码。 LocalFile 是声明类。所有连接细节都由主应用程序处理。

    if not self.LocalFile.__table__.exists(bind=Engine):
self.LocalFile__table__.create(bind=Engine)

这是 LocalFile 类 - Base 是声明性基类,在构造函数中传递了 bind=Engine:

   class LocalFile(Base):
__tablename__ = 'local_file'
_id = Column(Integer, Sequence('local_file_sequence', start=1, increment=1), primary_key=True)
_filename = Column(String(50), nullable=False)
_filepath = Column(String(128), nullable=False)
_movieid = Column(Integer, ForeignKey(db.tables.movies.c.movie_id, onupdate='CASCADE', ondelete='CASCADE'))
#movies = relation(db.Movie, backref="local_file", cascade="all")

@property
def filename(self):
return self._filename

@filename.setter
def filename(self, filename):
self._filename = filename

@property
def filepath(self):
return self._filepath

@filepath.setter
def filepath(self, filepath):
self._filepath = filepath

@property
def movieid(self):
return self._movieid

@movieid.setter
def movieid(self, movieid):
self._movieid = movieid

@property
def id(self):
return self._id

@id.setter
def id(self, id):
self._id = id

filename = synonym('_filename', descriptor=filename)
movieid = synonym('_movieid', descriptor=movieid)
filepath = synonym('_filepath', descriptor=filepath)
id = synonym('_id', descriptor=id)

def __init__(self, filename, filepath, movieid):
self._filename = filename
self._filepath = filepath
self._movieid = movieid

def __repr__(self):
return "<User('%s','%s', '%s')>" % (self.filename, self.filepath, self.movieid)

编辑:

后端是sqlite3。下面是使用 echo 命令生成的表的创建代码(感谢您指出这一点,它非常有用——我已经怀疑现有应用程序生成的 sql 远远超过了必要的数量)。报告的 sql 表创建之后是删除行时生成的代码。我个人看不到任何引用本地文件表中可能删除一行的语句,但我目前知道的sql很少。谢谢。

     2011-12-29 16:29:18,530 INFO sqlalchemy.engine.base.Engine.0x...0650 
CREATE TABLE local_file (
_id INTEGER NOT NULL,
_filename VARCHAR(50) NOT NULL,
_filepath VARCHAR(128) NOT NULL,
_movieid INTEGER,
PRIMARY KEY (_id),
FOREIGN KEY(_movieid) REFERENCES movies (movie_id) ON DELETE CASCADE ON UPDATE CASCADE

)

    2011-12-29T16:29:18: I: sqlalchemy.engine.base.Engine.0x...0650(base:1387): 
CREATE TABLE local_file (
_id INTEGER NOT NULL,
_filename VARCHAR(50) NOT NULL,
_filepath VARCHAR(128) NOT NULL,
_movieid INTEGER,
PRIMARY KEY (_id),
FOREIGN KEY(_movieid) REFERENCES movies (movie_id) ON DELETE CASCADE ON UPDATE CASCADE

)

2011-12-29 16:29:18,534 INFO sqlalchemy.engine.base.Engine.0x...0650 ()
2011-12-29T16:29:18: I: sqlalchemy.engine.base.Engine.0x...0650(base:1388): ()
2011-12-29 16:29:18,643 INFO sqlalchemy.engine.base.Engine.0x...0650 COMMIT
2011-12-29T16:29:18: I: sqlalchemy.engine.base.Engine.0x...0650(base:1095): COMMIT

for row in table 为两个表生成以下内容:

本地文件表:(,u'310 To Yuma')(,你'贪吃')

现有应用中的电影表:(, u'IMDb - 3:10 to Yuma')(,你'贪婪')

删除行时的代码太长,我不能在这里包含它(200 行左右 - 删除一行是不是有点太多了?),但它没有提到删除一行本地文件表。有这样的语句:

   2011-12-29 17:09:17,141 INFO sqlalchemy.engine.base.Engine.0x...0650 UPDATE movies SET   poster_md5=?, updated=? WHERE movies.movie_id = ?
2011-12-29T17:09:17: I: sqlalchemy.engine.base.Engine.0x...0650(base:1387): UPDATE movies SET poster_md5=?, updated=? WHERE movies.movie_id = ?
2011-12-29 17:09:17,142 INFO sqlalchemy.engine.base.Engine.0x...0650 (None, '2011-12-29 17:09:17.141019', 2)
2011-12-29T17:09:17: I: sqlalchemy.engine.base.Engine.0x...0650(base:1388): (None, '2011-12-29 17:09:17.141019', 2)
2011-12-29 17:09:17,150 INFO sqlalchemy.engine.base.Engine.0x...0650 DELETE FROM posters WHERE posters.md5sum = ?
2011-12-29T17:09:17: I: sqlalchemy.engine.base.Engine.0x...0650(base:1387): DELETE FROM posters WHERE posters.md5sum = ?
2011-12-29 17:09:17,157 INFO sqlalchemy.engine.base.Engine.0x...0650 (u'083841e14b8bb9ea166ea4b2b976f03d',)

最佳答案

在 SQLite 中,您必须显式打开对外键的支持,否则它会忽略任何与外键相关的 SQL。

engine = create_engine(database_url)

def on_connect(conn, record):
conn.execute('pragma foreign_keys=ON')

from sqlalchemy import event
event.listen(engine, 'connect', on_connect)

关于python - 删除未级联到sqlalchemy中的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8667096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com