2017-01-05 4 views
0

私はテキストファイルで私に提供された従来のデータセットを使用しています。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 ...] 

私は異なる専門性のカテゴリを持つ2つのテーブルを持っています。

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) 

カテゴリとサブカテゴリIDがビジネス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 ...] 

、私は市、USCounty、および国家のためのモデルを持っている:私はこれのようにマッピングされてきました。

市は、2文字コード(カリフォルニア州の場合はCAなど)を使用して州に外部キーを持ちます。郡への唯一の言及は名前によるものであり、衝突があるので固有の制約を持つことはできません。 USCountyには、county_FIPS、state_FIPS、state_code(2文字)などの主キーがあります。 state_FIPSとstate_codeは両方とも、状態オブジェクトを指すForeignKeysです。

MY TASK:

が特定の状態にある特定の郡内の特定の都市における特定のカテゴリに属する​​すべての企業を選択します。

米国の都市、州、および郡の全リストを使用している場合は、同じ州に同じ名前の郡、異なる州に同じ名前の郡などがあります。私は何の問題もなく、特定の市、郡、州内のすべての事業を引くことができますこれにより

specific_county = session.query(USCounty).filter_by(name=city.county).\ 
filter_by(state_code=city.state_code).first() 

は今、私が持つ特定の郡と状態を引っ張ります。これで、カテゴリまたはサブカテゴリに一致するものだけを取り出すことができます。

クエリが正しく動作しているか、テーブルを正しく定義していない(特にBusinessHeadings)

答えて

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あなたのデータベースのセットアップについてのより深い質問に私を導いた。

多分、私が気づいていないビジネス上の理由があるかもしれませんが、あなたには多くのテーブルがあるようです。これらのスキームのように、あなたは基本的な質問でさえ多くのことをやらなければならないでしょう。たぶんこれは最適なレイアウトですが、再考する価値があるかもしれません。

また、私はあなたが、私は考えていない主キーとして外部キーを使用していると思うBusinessHeadings表に推奨されます:

Is it fine to have foreign key as primary key?

+0

おかげで、これは働いていました。 はい、データベースの設定が正しくありませんでした。これが機能していますが、実際にはそれが多かったので、多対多の関係に変更されました。多くのカテゴリは多くのビジネスに属し、その逆もあります。 '.filter(Business.categories.any(name = cat_name)')をフィルタリングするだけです。 多対多関連テーブルのように見える場合は、次のようになります:) – brandonjschwartz

関連する問題