【发布时间】:2021-08-13 08:22:52
【问题描述】:
我目前正在将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 的最佳方法。我今天确实收到了关于我的代码的评论:
您的插入根本没有引用“商店”,所以不确定您希望从中得到什么,因为您在那里有一个子查询
我有点困惑这意味着什么但是我的问题是我想知道哪种方法是正确的插入方式
- 在应用程序启动时将 id 存储为变量并将变量传递给插入函数(参数)是否更好
- 或者调用
store_id=cls.select(cls.store.id).join(Stores).where(cls.store.store_name == store_name).get().store.id,我改为传递store_name,然后它会返回正确的ID?
我的第一个想法是,通过执行数字 2,这就像执行 2 个查询而不是一个查询?但我可能错了。期待知道!
【问题讨论】:
标签: python-3.x postgresql peewee