mysql 如何在SQLAlchemy中删除一个表并使用更多列重新创建它

ajsxfq5m  于 2022-12-17  发布在  Mysql
关注(0)|答案(1)|浏览(158)

我有这段代码,它做了我想做的事情,但是它只在我第一次运行时有效,而第二次运行时由于某种原因进入了无限循环
在MySQL中使用FastApi和SQLAlchemy
作为一种替代方法,为了避免使用XY issue,我实际上打算创建一个包含可变列的表(由表“属性”填充)。这可以是一个视图,但我还没有找到一种方法来创建包含所需内容的视图。最终目标是将我的数据库与单个视图或表格中的所有相关列和行连接起来,并将其连接到名为Altium的软件

def get_altium_plugin():
    engine.execute("DROP TABLE IF EXISTS altium_plugin")
    
    aRows = session.query(Attributes).group_by(Attributes.name).all()

    cRows = session.query(Component_Attributes).all()

    concat = " "
    x = 0
    while x < len(aRows):

        concat = concat + (aRows[x].name + " VARCHAR(20), ")

        x = x+1
        print(concat)

    concat = concat[:-2]

    engine.execute("CREATE TABLE IF NOT EXISTS altium_plugin (id INTEGER PRIMARY KEY AUTO_INCREMENT," + concat + ")")

    x = 0
    y = 0
    z = 1
    while x < len(aRows):
        while y < len(cRows):
            if cRows[y].attribute_id == aRows[x].id:
                dbstring = "INSERT INTO altium_plugin (" + aRows[x].name + ") VALUES ('" + cRows[y].value + "')"
                engine.execute(dbstring)
                print("X :" + str(x) + ", Y: " + str(y) + ", " + dbstring)
                z = z + 1
            y = y+1
        y = 0
        x = x+1

    rows = session.query(Altium_Plugin).all()
    return rows

我有上面的代码,我尝试过用非原始sql执行,但会抛出错误,我直接在SQL端作为脚本执行,它可以使用原始sql,但在启动python脚本后第二次运行此def时,它会被

engine.execute("DROP TABLE IF EXISTS altium_plugin")

并且只是无限循环,或者至少在试图处理某个东西时,它不会继续超出那个点
编辑:似乎在运行了一次代码之后,我就不能在MySQL Workbench中直接使用脚本了,除非我停止了我的python。引擎可能会继续使用SQL,但是除了占用空间和处理能力之外没有做任何事情,我怎么才能让引擎停止而不彻底关闭引擎呢?

np8igboo

np8igboo1#

DROP TABLE ...

...只是无限循环
如果您对锁表执行query操作,我不会对偶尔出现未完成的锁感到惊讶。
ALTER或DROP在开始之前必须获得一个Exclusive锁。它不会循环,只是挂起,耐心地等待锁被授予。我没有注意到您的代码中有任何COMMIT或ROLLBACK语句。删除TCP连接,或者反弹后端DB守护进程,都是其他(更暴力的)释放锁的方式,包括Reader锁。注意,您的交互式工作台也可以持有未提交的事务锁。
建议您在尝试DDL之前提交。

相关问题