我正在处理在文本文件中提供给我的遗留数据集。我有一张商家表:
class Business(Base):
__tablename__ = 'businesses'
id = Column(Integer, primary_key=True)
name = Column(String)
county_fips = Column(String)
state_code = Column(String(2), ForeignKey('states.code'))
state_fips = Column(String(2), ForeignKey('states.state_fips'))
city = Column(String)
[... a bunch of other columns ...]
我有两张不同特殊类别的表格。
class Category(Base):
__tablename__ = 'categories'
id = Column(Integer, primary_key=True)
name = Column(String)
class SubCategory(Base):
__tablename__ = 'sub_categories'
id = Column(Integer, primary_key=True)
name = Column(String)
我有一个巨大的文本文件,它将Category和SubCategory ID与Business ID相匹配。我已将其映射为:
class BusinessHeadings(Base):
__tablename__ = 'business_headings'
id = Column(ForeignKey('businesses.id'), primary_key=True)
cat_id = Column(ForeignKey('categories.id')
subcat_id = Column(ForeignKey('sub_categories.id')
[... another integer column ...]
在地理方面,我有City,USCounty和State的模型。
City通过两个字母的代码 - 加利福尼亚州的CA,以及其他国家/地区有一个ForeignKey状态。对县的唯一引用是按名称,由于存在冲突,因此无法具有唯一约束。 USCounty有一个主键,如county_FIPS,state_FIPS和state_code(两个字母)。 state_FIPS和state_code都是指向状态对象的ForeignKeys。
我的任务:
选择属于特定州特定县的特定城市中特定类别的所有商家。
如果您使用了美国城市,州和县的完整列表......在同一州有同名的城镇,不同州的同名县,等等。
现在,我拉着具体的县和州:
specific_county = session.query(USCounty).filter_by(name=city.county).\
filter_by(state_code=city.state_code).first()
有了这个,我可以毫无问题地将特定城市,县,州的所有业务拉出来。现在它通过它来挑选出只匹配类别或子类别的那些。
是否有可行的查询,或者我是否错误地定义了表格(特别是BusinessHeadings)?
答案 0 :(得分:0)
因此,要以面值回答您的问题,您需要执行JOIN
将业务位置数据与业务类别数据相关联。我觉得这样的事情可能有用:
session.query(Business, BusinessHeadings).
join(BusinessHeadings).
filter(Business.county_fips == county_fips).
filter(Business.state_code == state_code).
filter(Business.city == city).
filter(BusinessHeadings.cat_id==cat_id).
filter(BusinessHeadings.subcat_id==subcat_id).
all()
我假设您在进行此查询之前可以访问所需的所有代码。但是考虑如何构建JOIN
会让我对数据库设置有更深层次的质疑。
也许有我不知道的商业原因,但似乎你有很多桌子在进行。就像使用这些方案一样,即使是基本查询,您也必须做很多JOINS
。也许这是最好的布局,但可能值得重新考虑。
此外,对于BusinessHeadings
表,我认为您使用外键作为主键,我认为不推荐使用: