SqlAlchemy: динамические запросы - PullRequest
       6

SqlAlchemy: динамические запросы

2 голосов
/ 07 сентября 2011

Как делать динамические запросы в SqlAlchemy ORM (если это правильное имя для них).

Я использовал SqlAlchemy в качестве абстракции для базы данных, с запросами в коде Python, но что, если мне нужно сгенерировать ихЗапросы динамически, а не только установить параметры запроса, такие как «идентификатор»?

Например, мне нужно создать запрос из списка (имена таблиц, имена столбцов, объединенные столбцы), который связывает три таблицы, такие как «организация»,"люди", "персонал".Как я могу сделать это правильно?

Например, я имел в виду этот список: [{'table': 'organization', 'column': 'staff_id'}, {'table': 'staff', 'столбец ':' id '}]

И выходные данные, например, могут содержать: organisation.id, organisation.name, organisation.staff_id, staff.id, staff.name (столбец name представлен только в выходных данных, посколькуМне нужен простой пример, получая все столбцы таблиц, а массив должен просто установить соединения)

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

Вы можете использовать mapper в результате вызова sqlalchemy.sql.join и / или sqlalchemy.select. Это примерно эквивалентно использованию mapper в представлении базы данных; Вы можете запрашивать такие классы естественным образом, но не обязательно создавать новые записи. Вы также можете использовать sqlalchemy.orm.column_property для сопоставления вычисленных значений с атрибутами объекта. Когда я читаю ваш вопрос, комбинация этих трех методов должна соответствовать вашим потребностям.

1 голос
/ 07 сентября 2011

Не тестировал, но с помощью SQLAlchemy ORM вы можете связать таблицы вместе, например:

from sqlalchemy import create_engine, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, ForeignKey
from sqlalchemy.orm import relationship
from asgportal.database import Session

Engine = create_engine('mysql+mysqldb://user:password@localhost:3306/mydatabase', pool_recycle=3600)
Base = declarative_base(bind=Engine)
session = Session()
session.configure(bind=Engine)

class DBOrganization(Base):
    __tablename__ = 'table_organization'
    id = Column(Integer(), primary_key=True)
    name = Column(ASGType.sa(ASGType.STRING))

class DBEmployee(Base):
    __tablename__ = 'table_employee'
    id = Column(Integer(), primary_key=True)
    name = Column(String(255))

    organization_id = Column(Integer(), ForeignKey('table_organization.id'))
    # backref below will be an array[] unless you specify uselist=False
    organization = relationship(DBOrganization, backref='employees')

Base.metadata.create_all()

# From here, you can query:
rs = session.query(DBEmployee).join(DBEmployee.organization).filter(DBOrganization.name=='my organization')

for employees in rs:
    print '{0} works for {1}'.format(employees.name,employees.organization.name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...