2017-07-03 19 views
0

SQLの錬金術を使用してクエリを作成しようとしていますが、ORMを使用していなかった場合は非常に簡単でしたので、確かに簡単な方法が必要です。私はこのトピックに関するほとんどの質問を行ってきましたが、私の質問に答えていないようです。私は、カテゴリ別に職人をフィルタリングしたい次いで濾過職人によってアドレスをフィルタリングし、関連付け方法で結果を提示するこの2つの表SQL Alchemyの複数のテーブルのクエリ

class Artisan(Base): 
    __tablename__ = 'artisan' 
    name = Column(String(80), nullable=False) 
    skill = Column(String(80), nullable=False) 
    id = Column(Integer, primary_key=True) 
    bio = Column(String(300)) 
    category = Column(Integer, ForeignKey(Category.id)) 
    user = Column(Integer, ForeignKey(Users.id)) 
    id_no = Column(Integer, nullable=False) 
    users = relationship(Users) 

class Address(Base): 
    __tablename__ = 'address' 
    building = Column(String(80), nullable=False) 
    floor = Column(String(80), nullable=False) 
    house_no = Column(String(80), nullable=False) 
    telephone = Column(String(80), nullable=False) 
    kwetu_address = Column(String(80), nullable=False) 
    id = Column(Integer, primary_key=True) 
    lat = Column(String(25)) 
    lng = Column(String(25)) 
    artisan = Column(Integer, ForeignKey(Artisan.id)) 
    user = Column(Integer, ForeignKey(Users.id)) 
    users = relationship(Users) 

を持っていますそれぞれのアドレスは、うまくいけば最高の私が思い付くことができフィルタリング

を行うにはsqlachemyを取得して、当業者は、私は非常に非効率的であると感じ2つのクエリおよび後処理を必要とする

my_artisans = (session.query(Artisan).filter_by(category=cat_id)) 
my_addresses = (session.query(Address) 
         .join(Artisan, Artisan.id ==Address.artisan).filter_by(category=cat_id)) 
return jsonify(artisans =[art.serialize for art in my_artisans], addresses=[add.serialize for add in my_addresses]) 

おかげ

に追加 - すべての関連クラス

import sys 
from sqlalchemy import Column, ForeignKey, Integer, String, Float 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import relationship 
from sqlalchemy import create_engine 

Base = declarative_base() 


class Users(Base): 
    __tablename__ = 'users' 
    name = Column(String(80), nullable=False) 
    email = Column(String(80), nullable=False) 
    id = Column(Integer, primary_key=True) 
    bio = Column(String(300)) 
    picture = Column(String(80)) 


class Category(Base): 
    __tablename__ = 'category' 
    name = Column(String(80), nullable=False) 
    id = Column(Integer, primary_key=True) 
    user = Column(Integer, ForeignKey(Users.id)) 
    users = relationship(Users) 

    @property 
    def serialize(self): 
     return{ 
      'id': self.id, 
      'name': self.name 
     } 


class Artisan(Base): 
    __tablename__ = 'artisan' 
    name = Column(String(80), nullable=False) 
    skill = Column(String(80), nullable=False) 
    id = Column(Integer, primary_key=True) 
    bio = Column(String(300)) 
    category = Column(Integer, ForeignKey(Category.id)) 
    user = Column(Integer, ForeignKey(Users.id)) 
    id_no = Column(Integer, nullable=False) 
    users = relationship(Users) 

    @property 
    def serialize(self): 
     return{ 
      'id': self.id, 
      'name': self.name, 
      'skill': self.skill, 
      'category': self.category, 
      'bio': self.bio, 
      'id_no': self.id_no 

     } 


class Portfolio(Base): 
    __tablename__ = 'portfolio' 
    title = Column(String(80), nullable=False) 
    details = Column(String(300), nullable=False) 
    id = Column(Integer, primary_key=True) 
    artisan = Column(Integer, ForeignKey(Artisan.id)) 
    user = Column(Integer, ForeignKey(Users.id)) 
    users = relationship(Users) 

    @property 
    def serialize(self): 
     return{ 
      'id': self.id, 
      'title': self.title, 
      'details': self.details 
     } 


class Endorsements(Base): 
    __tablename__ = 'endorsements' 
    title = Column(String(80), nullable=False) 
    details = Column(String(300), nullable=False) 
    id = Column(Integer, primary_key=True) 
    artisan = Column(Integer, ForeignKey(Artisan.id)) 
    user = Column(Integer, ForeignKey(Users.id)) 
    users = relationship(Users) 

    @property 
    def serialize(self): 
     return{ 
      'id': self.id, 
      'title': self.title, 
      'details': self.details 
     } 


class Address(Base): 
    __tablename__ = 'address' 
    building = Column(String(80), nullable=False) 
    floor = Column(String(80), nullable=False) 
    house_no = Column(String(80), nullable=False) 
    telephone = Column(String(80), nullable=False) 
    kwetu_address = Column(String(80), nullable=False) 
    id = Column(Integer, primary_key=True) 
    lat = Column(String(25)) 
    lng = Column(String(25)) 
    artisan = Column(Integer, ForeignKey(Artisan.id)) 
    user = Column(Integer, ForeignKey(Users.id)) 
    users = relationship(Users) 

    @property 
    def serialize(self): 
     return{ 
      'id': self.id, 
      'lat': self.lat, 
      'lng': self.lng, 
      'kwetu_address': self.kwetu_address, 
      'artisan': self.artisan 
     } 


engine = create_engine('sqlite:///mycatalog.db') 

Base.metadata.create_all(engine) 
+0

を使用しているが、私は、それぞれのアドレスと私の職人を関連付けるの面で必要なものを私に与えましたあなたの関係船のような音は良くない!あなたのデータベース構造をうまく説明したり、ERダイアグラムやクラスダイアグラムを教えてください。最初の問題のようなサウンドはデータベースモデルにあります –

答えて

0

これはまだ2つのクエリ

my_artisans = (session.query(Artisan).filter_by(category=cat_id)) 
my_addresses = (session.query(Address) 
         .join(Artisan, Artisan.id ==Address.artisan).filter_by(category=cat_id)) 
these_addresses = [] 
for art in my_artisans: 
    art_id = art.id 
    for add in my_addresses: 
     if art_id == add.artisan: 
      grouped_address = {"Artisan Id" : art.id, "name" : art.name, "skill" : art.skill, "Lat" : add.lat, "lng" : add.lng} 
       these_addresses.append(grouped_address) 

    return jsonify({'Addresses': these_addresses }) 
関連する問題