Уведомления

Jabber-конференция сообщества: pythonua@conference.jabber.ru

#1 Март 23, 2007 22:28:12

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlobject - разница в датах в select

всем привет!
есть бд со следующей структурой:

from sqlobject import *
from sqlobject.sqlbuilder import EXISTS, Select
from datetime import datetime
import time
class Customer(SQLObject):
    name = UnicodeCol()
    city = ForeignKey("City")
    Rating = IntCol()
    salespeople = ForeignKey("SalesPeople")
    orders = MultipleJoin("Order1")
    
class Order1(SQLObject):
    Amt = FloatCol()
    Odate = DateTimeCol()
    salespeople = ForeignKey("SalesPeople")
    customer = ForeignKey("Customer")
   
class SalesPeople(SQLObject):
    name=UnicodeCol()
    comm = FloatCol()
    city = ForeignKey("City")
    customers = MultipleJoin("Customer", joinColumn="salespeople_id")
    orders = MultipleJoin("Order1")
    
class City(SQLObject):
    name = UnicodeCol()
    customers = MultipleJoin("Customer", joinColumn="city_id")
    peoples = MultipleJoin("SalesPeople", joinColumn="city_id")
connection_string = "postgres://user:11111111@localhost:5432/test1"
connection = connectionForURI(connection_string)
sqlhub.processConnection = connection

подскажите, пожалуйста, как упростить ниже описанный запрос?

def select9_1(list1):
    prev=None
    for order in list1:
        if prev==None:
            pass
        elif (prev-time.mktime(order.Odate.timetuple()))<=172800.0:
            return True
        prev = time.mktime(order.Odate.timetuple())    
    return False
def select9():
    k = 0
    for cus in Customer.select():
        if select9_1(cus.orders):
            k+=1
            print cus.name
    print "k = ", k
хорошо бы вообще написать в одну строку или даже одним запросом



Офлайн

#2 Март 24, 2007 06:30:39

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlobject - разница в датах в select

Ух. Читай PEP8. Может, конечно, есть внутренний глубокий смысл чтобы rating называть с заглавной, и order_date тоже, и сокращать amount до amt, но читабельности это не прибавляет – факт. Названия переменных/функций тоже не блещут логикой: “select9_1”, “select9”, “list1” - примеры как не надо называть функции/переменные.

И еще. Лучше бы ты словами объяснил, чего тебе надо. Потому как вместо двух действий (понять чего тебе надо, придумать решение), приходится делать три (расшифровать твой код, догадаться чего тебе нужно, придумать решение).

В общем, сформулируй свою задачу словами.



Офлайн

#3 Март 25, 2007 14:31:30

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlobject - разница в датах в select

j2a
примеры как не надо называть функции/переменные.
согласен - самого напрягает - названия не от меня зависели - за ссылку спасибо

j2a
В общем, сформулируй свою задачу словами.
нужно вывести клиентов(заказчиков), которые ежедневно регистрировали заказы, если заказчик в один день разместил более одного заказа, то заказ должен учитываться только один раз, например: заказчик, который сделал все заказы в один нет не должен быть выведен :)



Офлайн

#4 Март 26, 2007 09:25:03

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlobject - разница в датах в select

pythonwin
согласен - самого напрягает - названия не от меня зависели
Выбор sqlobject тоже ;-) ?



Офлайн

#5 Март 26, 2007 17:53:40

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlobject - разница в датах в select

Преждевременная оптимизация – зло. Я не знаю, можно ли это сделать при помощи ORM, на чистом SQL это делается двойной выборкой из orders, что-то типа

sqlite> select * from customers;
1 Рога и копыта
2 Бендер и Ко
3 Киса
sqlite> select * from orders;
1 3 10 20070326
2 3 3 20070325
3 3 15 20070324
4 1 20 20070324
5 1 7 20070324
sqlite> SELECT DISTINCT c.name
...> FROM customers AS c
...> INNER JOIN orders AS o1 ON c.id = o1.customer_id
...> INNER JOIN orders AS o2 ON c.id = o2.customer_id
...> WHERE
...> o1.id < o2.id AND
...> o1.order_date - o2.order_date = 1;
Киса



Отредактировано (Март 26, 2007 17:54:20)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version