Выберите заявление с SqlAlchemy - PullRequest
0 голосов
/ 19 ноября 2009

Да, очень простой вопрос. Я успешно создал свою базу данных, используя Declarative_base, и могу выполнять вставки в базу данных тоже. У меня есть только несколько вопросов о SQL-выражениях SqlAlchemy.

Я создал таблицу с именем Location.
Несколько вопросов / вопросов (см. Код ниже):

  1. Для оператора "print row" я должен указать имя каждого столбца, который я хочу вывести. то есть "напечатать row.name, row.lat и т. д." Почему? (В противном случае оператор вывода выводит "<classname.Location at <...>>"

  2. Кроме того, каков предпочтительный способ взаимодействия с БД и выполнения запросов (выбор, вставка, обновление и т. или engine.text (<sql query>).execute().fetchall(), или даже conn.execute(<select>). Опции хороши, но сейчас они меня просто смущают.

Большое спасибо за советы!

Вот мой код:

from sqlalchemy import create_engine
from sqlalchemy.sql import select
from location_db_setup import *

db_path = "sqlite:////volumes/users/shared/programming/python/web/map.db"
engine = create_engine(db_path, echo= True)
Session = sessionmaker(bind= engine)
session = Session()

session.query(Location).fetchall()
for row in locations:
        print row

Ответы [ 3 ]

2 голосов
/ 19 ноября 2009
  1. Ваш код в образце неполный и содержит ошибки. Так что невозможно точно сказать, что здесь Location. Я предполагаю, что это сопоставленный класс, поэтому вы запрашиваете список всех Location объектов , а не строк . Когда вы печатаете объект, вы получаете его строковое представление. Строковое представление объектов можно изменить, определив пользовательский метод __str__.
  2. Хотя ORM является наиболее важной частью SQLAlchemy, она не единственная. Он также предоставляет множество функций, не связанных непосредственно с ORM. При работе с объектами предпочтительным способом создания запросов является соответствующий метод сеанса. Но иногда вам нужны выбираемые объекты, не привязанные к определенному сеансу (они не выполняются напрямую, а используются в выражениях, передаваемых методам сеанса). Поэтому в пакете sqlalchemy.orm есть функции.
1 голос
/ 21 ноября 2009

Денис и Килотан дали вам хорошие ответы. Я просто сосредоточусь на пункте 2.

Иногда зависит от вашего вкуса. Есть моменты, когда вам нужны специфичные для базы данных функции, которые ORM не может сделать, это тот случай, когда вы должны использовать Session(<sql here>).execute() или conn.execute(<sql here>). Другой случай, когда у вас очень сложный запрос, который вам не подходит, и вы не можете найти подходящее выражение ORM.

Обычно достаточно использования функций ORM, таких как select([...]).where(... или Session.query(<Model here>).filter(... (декларативная база). Почти каждый SQL-запрос имеет эквивалент ORM.

1 голос
/ 19 ноября 2009

Предпочтительным способом взаимодействия с БД при использовании ORM является не использование запросов, а использование объектов, которые соответствуют таблицам, которыми вы манипулируете, обычно в сочетании с объектом сеанса. Запросы SELECT становятся вызовами get () или find () в одних ORM, вызовами query () в других. INSERT создает новый объект нужного вам типа (и, возможно, добавляет его явно, например, session.add () в sqlalchemy). UPDATE становится редактированием такого объекта, а DELETE становится удалением объекта (например, session.delete ()). ORM предназначен для выполнения тяжелой работы по переводу этих операций в SQL для вас.

Читали ли вы учебник ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...