如何使用 JOIN 插入数据库

How to INSERT into a database using JOIN

我目前正在使用 PeeWee 和 Python,并且我已经成功创建了一个很酷的应用程序

CREATE TABLE stores (
    id SERIAL PRIMARY KEY,
    store_name TEXT
);


CREATE TABLE products (
    id SERIAL, 
    store_id INTEGER NOT NULL,
    title TEXT,
    image TEXT,
    url TEXT UNIQUE, 
    added_date timestamp without time zone NOT NULL DEFAULT NOW(),
    PRIMARY KEY(id, store_id)
);


ALTER TABLE products
ADD  CONSTRAINT "FK_products_stores" FOREIGN KEY ("store_id")
        REFERENCES stores (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE RESTRICT;

已通过以下代码转换为 peewee:

# ------------------------------------------------------------------------------- #
class Stores(Model):
    id = IntegerField(column_name='id')
    store_name = TextField(column_name='store_name')

    class Meta:
        database = postgres_pool
        db_table = "stores"

    @classmethod
    def get_all(cls):
        try:
            return cls.select(cls.id, cls.store_name).order_by(cls.store)
        except Stores.IntegrityError:
            return None


# ------------------------------------------------------------------------------- #
class Products(Model):
    id = IntegerField(column_name='id')
    title = TextField(column_name='title')
    url = TextField(column_name='url')
    image = TextField(column_name='image')
    store = ForeignKeyField(Stores, backref='products')

    class Meta:
        database = postgres_pool
        db_table = "products"

    @classmethod
    def add_product(cls, pageData, store_name):
        """
        INSERT
        INTO
        public.products(store_id, title, image, url)
        VALUES((SELECT id FROM stores WHERE store_name = 'footish'), 'Teva Flatform Universal Pride',
               'https://www.footish.se/sneakers/teva-flatform-universal-pride-t1116376',
               'https://www.footish.se/pub_images/large/teva-flatform-universal-pride-t1116376-p77148.jpg?timestamp=1623417840')
        """
        try:
            return cls.insert(
                store_id=cls.select(cls.store.id).join(Stores).where(cls.store.store_name == store_name).get().store.id,
                title=pageData.title,
                url=pageData.url,
                image=pageData.image,
            ).execute()
        except Products.DoesNotExist:
           return None

但是我已经意识到使用 ID 比使用文本要快得多,而且我遇到了一个问题,我试图找出插入 ID 的最佳方式。今天我确实收到了关于我的代码的评论:

your insert isn't' referencing "stores" at all so not sure what your hoping to get from that since you have a sub query there

我有点困惑这是什么意思,但是我的问题是我想知道哪种方法是正确的插入方式

  1. 在应用程序启动时,将 id 存储为变量并将变量传递给插入函数(参数)是否更好
  2. 或者调用 store_id=cls.select(cls.store.id).join(Stores).where(cls.store.store_name == store_name).get().store.id 而不是传递 store_name 然后它将 return 正确的 ID?

我的第一个想法是,通过执行数字 2,就像执行 2 个查询而不是一个?但我可能是错的。期待了解!

这是完全不正确的:

# Wrong
store_id=cls.select(cls.store.id).join(Stores).where(cls.store.store_name == store_name).get().store.id,

正确:

try:
    store = Stores.select().where(Stores.name == store_name).get()
except Stores.DoesNotExist:
    # the store name does not exist. do whatever?
    return
Products.insert(store=store, ...rest-of-fields...).execute()