Sqlalchemy - 如何执行此查询,这是正确的吗?

时间:2017-01-05 01:11:47

标签: python sqlalchemy

我正在处理在文本文件中提供给我的遗留数据集。我有一张商家表:

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)?

1 个答案:

答案 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表,我认为您使用外键作为主键,我认为不推荐使用:

Is it fine to have foreign key as primary key?

相关问题