python - 更新多行可能已过时的表数据

标签 python mysql sql database pymysql

我有一个应用程序,我可以在其中创建和编辑由成分及其数量组成的食谱。此信息应该保存在关系数据库(可能是 MySQL 或 SQLite)中。我有一个存储食谱的表和一个 auto_increment 主键和另一个表,我在其中保存成分和数量,通过外键约束引用第一个表。

现在我想在我的应用程序中编写更新代码。我将食谱 ID 保存在我的食谱对象中,因此我可以很容易地引用它。但是我如何正确更新成分和数量?第二个表的多行可能已经过时,必须删除,有些只需要更新(当金额发生变化时)。

我想到的最简单的解决方案就是删除所有引用我当前食谱的行并重新插入它们。这是一种可接受的方法,还是存在针对此类问题的模式/最佳实践?


注意:我知道我可以将成分和数量保存在 varchar stringlist 中,但我想使用某种表结构。


编辑:表创建代码:

CREATE TABLE `recipe` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(30) NOT NULL
    PRIMARY KEY (`id`)
)

CREATE TABLE `recipe_ingredients` (
    `recipe_id` INT(11) NOT NULL,
    `ingredient` VARCHAR(30) NOT NULL,
    `amount` FLOAT NOT NULL,
    `measurement_unit` VARCHAR(10) NOT NULL,
    INDEX `recipe_id` (`recipe_id`),
    CONSTRAINT `recipe_ingredients_ibfk_1` FOREIGN KEY (`recipe_id`) REFERENCES `recipe` (`id`),
    CONSTRAINT `recipe_ingredients_ibfk_2` FOREIGN KEY (`recipe_id`) REFERENCES `recipe` (`id`)
)

最佳答案

将 auto_increment 主键添加到您的成分表。然后,当您的应用程序发布更新时,您可以通过其主键识别正在更新的成分。

我会像这样添加 PK:

CREATE TABLE `recipe_ingredients` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `recipe_id` INT(11) NOT NULL,
    `ingredient` VARCHAR(30) NOT NULL,
    `amount` FLOAT NOT NULL,
    `measurement_unit` VARCHAR(10) NOT NULL,
    PRIMARY KEY (`id`)
    INDEX `recipe_id` (`recipe_id`),
    CONSTRAINT `recipe_ingredients_ibfk_1` FOREIGN KEY (`recipe_id`) REFERENCES `recipe` (`id`),    
)

在您的 UI 中,您将遍历成分并将它们显示在单独的行中,成分 ID 与每一行相关联。它可能看起来像这样:

<table>
  <thead>
    <tr>
      <th>Ingredient</th>
      <th>Amount</th>
      <th>Units</th>
    </tr>
  </thead>
  <tdata>
    <tr>
      <td>
        <input type='hidden' id='ingredient1_id' value='1' />
        <input type='text' id='ingredient1_name' value="salt" />
      </td>
      <td>
        <input type='text' id='ingredient1_amount' value="2" />
      </td>
      <td>
        <input type='text' id='ingredient1_unit' value="tsp" />
      </td>
    </tr>
    <tr>
      <td>
        <input type='hidden' id='ingredient2_id' value='2' />
        <input type='text' id='ingredient2_name' value="flour" />
      </td>
      <td>
        <input type='text' id='ingredient2_amount' value="3" />
      </td>
      <td>
        <input type='text' id='ingredient2_unit' value="cups" />
      </td>
    </tr>
  </tdata>
</table>

现在,如果用户编辑或删除盐行,您就知道它是 ID 为 1 的成分,并且您可以在数据库中识别它。

关于python - 更新多行可能已过时的表数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35555912/

相关文章:

javascript - 使用 Ajax 和 Python 返回 Highcharts

python - 将文本文件更改为列表

mysql - Node Js如何对数据库进行实时检查?

mysql - 如何创建像搜索一样的 indeed.com?

python - Dash(Python) - dash-daq 仪表中的较厚环

python - 如何在 Python 中解析 YAML 文件

php - 表没有得到更新

mysql - 如何在 mysql 列中搜索文本并包含标点符号

php - 从数组更新表sql时出错

mysql - 计算两个计算字段的差异