咨询一个数据库问题

4 views
Skip to first unread message

asmcos (SoSE)

unread,
Feb 9, 2012, 12:07:11 AM2/9/12
to uli...@googlegroups.com
我想给以往的参加过讲座的人发新讲座通知。(发邮件)

问题是: 有的人参加过很多次讲座,因此数据库里邮件有很多重复的。
我怎么能从数据库里面获取所有的邮件,并且重复的邮件只保留1个。


--
----------------
何家胜
SoSE(so easy)  就这么简单!
website : http://www.jeapedu.com
手机    :137-1860-9533(移动),18010096001 (电信)
MSN    :  asm...@hotmail.com

asmcos (SoSE)

unread,
Feb 9, 2012, 1:31:45 AM2/9/12
to uli...@googlegroups.com
.all().distinct('email')

我用上面的方式查询,但还是有重复有邮件。。。。

Chunlin Zhang

unread,
Feb 9, 2012, 2:05:47 AM2/9/12
to uli...@googlegroups.com
要不然你再发送的时候保证不重复也行嘛

2012/2/9 asmcos (SoSE) <asm...@gmail.com>:

> --
> mail list: http://groups.google.com/group/uliweb
> project : http://code.google.com/p/uliweb

asmcos (SoSE)

unread,
Feb 9, 2012, 2:08:02 AM2/9/12
to uli...@googlegroups.com


在 2012年2月9日 下午3:05,Chunlin Zhang <zhangc...@gmail.com>写道:
要不然你再发送的时候保证不重复也行嘛

怎么做? 每发一个都搜索判断一次?

Chunlin Zhang

unread,
Feb 9, 2012, 2:52:38 AM2/9/12
to uli...@googlegroups.com
发过的放在一个 dict 里,发下一个如果发现 dict 里已经有这个 key 就不发了,或者用这个方法也可以构造一个不重复的集合

2012/2/9 asmcos (SoSE) <asm...@gmail.com>:

limodou

unread,
Feb 9, 2012, 9:27:58 AM2/9/12
to uli...@googlegroups.com
2012/2/9 asmcos (SoSE) <asm...@gmail.com>:

> .all().distinct('email')
>
> 我用上面的方式查询,但还是有重复有邮件。。。。
>

怎么个重复法,你可以打开

[ORM]
DEBUG_LOG = True

在控制台看一下输出的sql语句是否正确,并且可以在数据库工具中直接输入对 应的Sql语句看是否不会重复?

--
I like python!
UliPad <<The Python Editor>>: http://code.google.com/p/ulipad/
UliWeb <<simple web framework>>: http://code.google.com/p/uliweb/
My Blog: http://hi.baidu.com/limodou

asmcos (SoSE)

unread,
Feb 9, 2012, 8:19:17 PM2/9/12
to uli...@googlegroups.com
增加了 DEBUG_LOG=True;

浏览主页没有发现SQL语句?我看你的文档中写的是查看日志。
下面的信息是否是你说的日志?还是说有个其他的log文件?

uliweb runserver
[INFO]  * Loading DebuggedApplication...
[INFO]  * Running on http://localhost:8000/
[INFO]  * Restarting with reloader
[INFO]  * Loading DebuggedApplication...
<uliweb.orm.Result object at 0x9df61ac>
[INFO] 127.0.0.1 - - [10/Feb/2012 09:19:36] "GET / HTTP/1.1" 200 -


asmcos (SoSE)

unread,
Feb 9, 2012, 8:30:56 PM2/9/12
to uli...@googlegroups.com
在 2012年2月10日 上午9:19,asmcos (SoSE) <asm...@gmail.com>写道:
增加了 DEBUG_LOG=True;

浏览主页没有发现SQL语句?我看你的文档中写的是查看日志。
下面的信息是否是你说的日志?还是说有个其他的log文件?

看到信息了。 刚才也许是 all().distinct('email') 有问题?
将后面的 distinct()去掉就有了。。。。

我再看看。

asmcos (SoSE)

unread,
Feb 9, 2012, 9:38:56 PM2/9/12
to uli...@googlegroups.com
语句 .all().distinct('p_name')
我本机测试错误提示:
TypeError: <lambda>() takes exactly 1 argument (2 given)

错误在 uliweb orm __init__.py 的1082行:
query = getattr(query, func)(*args, **kwargs) 

我打印 :
args  = (('p_name',),)
func  = distinct
query = SELECT mpoints.p_name, mpoints.p_av_addr, mpoints.p_desc, mpoints.id 
FROM mpoints

我按照提示做了测试,更改语句:
.all().distinct()
可以运行,但结果不是我要的。
SQL 语句 为:
SELECT DISTINCT mpoints.p_name, mpoints.p_av_addr, mpoints.p_desc, mpoints.id 
FROM mpoints

我期望的sql语句为:
SELECT DISTINCT mpoints.p_name FROM mpoints

错误猜测:
 uliweb orm __init__.py 的1082行:
query = getattr(query, func)(*args, **kwargs) 

通过参数转换成我期望的语句,结果失败。

我的机器ubuntu 11.04  

SQLAlchemy 版本 0.6.4



另外再问一句我的clkg 服务器是apache + python + uliweb
怎么查看DEBUG_LOG 日志 ?
 

limodou

unread,
Feb 9, 2012, 9:50:19 PM2/9/12
to uli...@googlegroups.com
2012/2/10 asmcos (SoSE) <asm...@gmail.com>:

distinct要添加字段列表,你的是空的,要把email加进去吧。

DEBUG_LOG会输出到控制台,会不会是在apache下的access.log中?

asmcos (SoSE)

unread,
Feb 9, 2012, 10:05:46 PM2/9/12
to uli...@googlegroups.com
我更改了 uliweb orm __init__.py
    def distinct(self, *args, **kwargs):
        self.funcs.append(('with_only_columns', (args,), kwargs))
        return self

并且使用方法为:
mpoints.all().distinct('distinct p_name')
他就成功了。

我理解:with_only_columns 是用 args 替换原有的参数。
因此args 'distinct p_name'

log信息:
(('distinct p_name',),)
with_only_columns
SELECT mpoints.p_name, mpoints.p_av_addr, mpoints.p_desc, mpoints.id 
FROM mpoints


SQL结果:SELECT distinct p_name 
FROM mpoints

---------
BTW:
我跟踪我的ORM 里面:
sqlalchemy$ vim sql/expression.py

    @_generative                                                                                                               
    def distinct(self):                                                                                                        
        """return a new select() construct which will apply DISTINCT to its                                                    
        columns clause.                                                                                                        
                                                                                                                               
         """                                                                                                                   
        self._distinct = True

我认为和这个distinct定义有关系。



asmcos (SoSE)

unread,
Feb 9, 2012, 10:16:29 PM2/9/12
to uli...@googlegroups.com
distinct 的时候是不是应该 更改:self.condition = condition ?

asmcos (SoSE)

unread,
Feb 9, 2012, 11:03:18 PM2/9/12
to uli...@googlegroups.com
按照 mysql 语法其实我们要得结果是这样:
SELECT DISTINCT(column),column1,column2,... FROM tb_name

我参考的这篇文章
http://www.5idev.com/p-php_mysql_distinct.shtml

不知道uliweb能否方便改成这样的。
另外:sqlalchemy 里面distinct接口也在变。

limodou

unread,
Feb 9, 2012, 11:46:41 PM2/9/12
to uli...@googlegroups.com
2012/2/10 asmcos (SoSE) <asm...@gmail.com>:

> 按照 mysql 语法其实我们要得结果是这样:
>
> SELECT DISTINCT(column),column1,column2,... FROM tb_name
>
>
> 我参考的这篇文章
>
> http://www.5idev.com/p-php_mysql_distinct.shtml
>
>
> 不知道uliweb能否方便改成这样的。
> 另外:sqlalchemy 里面distinct接口也在变。
>

你说sqlalchemy的接口在变,能否提供url看一下?

asmcos (SoSE)

unread,
Feb 9, 2012, 11:58:34 PM2/9/12
to uli...@googlegroups.com
0.5.8 版本:
/sqlalchemy$ vim sql/expression.py

def distinct(expr):
    """Return a ``DISTINCT`` clause."""
    expr = _literal_as_binds(expr)
    return _UnaryExpression(expr, operator=operators.distinct_op, type_=expr.type)



0.6.4 版本:
/sqlalchemy$ vim sql/expression.py
    @_generative                                                         
    def distinct(self):                                                 
        """return a new select() construct which will apply DISTINCT to its
        columns clause.                                             
                              
         """                       
        self._distinct = True    

-------------------------

limodou

unread,
Feb 10, 2012, 12:43:26 AM2/10/12
to uli...@googlegroups.com
2012/2/10 asmcos (SoSE) <asm...@gmail.com>:

> 0.5.8 版本:
> /sqlalchemy$ vim sql/expression.py
>
> def distinct(expr):
> """Return a ``DISTINCT`` clause."""
> expr = _literal_as_binds(expr)
> return _UnaryExpression(expr, operator=operators.distinct_op,
> type_=expr.type)
>
>
>
> 0.6.4 版本:
> /sqlalchemy$ vim sql/expression.py
> @_generative
> def distinct(self):
> """return a new select() construct which will apply DISTINCT to its
> columns clause.
>
> """
> self._distinct = True
>

我又查了一下,distinct应该可以算是有两种用法,一种是对返回所有字段作distinct处理,因此这种情况下相当于是

select distinct field1, field2 from table

因此Model.all().distinct()会在最前面加上distinct关键字,但是把所有字段列在后面。因此,如果只想显示个别字段,则可以使用values(),如:

Model.all().distinct().values(Model.c.field1, Model.c.field2)

但上面的处理是对于整条记录作了distinct处理,因此对于想混和有distinct字段和无distinct的字段时,可使用func.distinct函数,同时结合values,如:

Model.all().values(func.distinct(Model.c.field1), Model.c.field2)

这样生成的结果就是:

select distinct(field1), field2 from table

因此这种处理应该可以满足你的要求。

asmcos (SoSE)

unread,
Feb 10, 2012, 12:51:45 AM2/10/12
to uli...@googlegroups.com
在 2012年2月10日 下午1:43,limodou <lim...@gmail.com>写道:
2012/2/10 asmcos (SoSE) <asm...@gmail.com>:
> 0.5.8 版本:
> /sqlalchemy$ vim sql/expression.py
>
> def distinct(expr):
>     """Return a ``DISTINCT`` clause."""
>     expr = _literal_as_binds(expr)
>     return _UnaryExpression(expr, operator=operators.distinct_op,
> type_=expr.type)
>
>
>
> 0.6.4 版本:
> /sqlalchemy$ vim sql/expression.py
>     @_generative
>     def distinct(self):
>         """return a new select() construct which will apply DISTINCT to its
>         columns clause.
>
>          """
>         self._distinct = True
>

我又查了一下,distinct应该可以算是有两种用法,一种是对返回所有字段作distinct处理,因此这种情况下相当于是

select distinct field1, field2 from table

因此Model.all().distinct()会在最前面加上distinct关键字,但是把所有字段列在后面。因此,如果只想显示个别字段,则可以使用values(),如:

Model.all().distinct().values(Model.c.field1, Model.c.field2)

但上面的处理是对于整条记录作了distinct处理,因此对于想混和有distinct字段和无distinct的字段时,可使用func.distinct函数,同时结合values,如:

Model.all().values(func.distinct(Model.c.field1), Model.c.field2)

func 改用什么代替吗?
Apply.all().values(func.distinct(Apply.c.email),Apply.c.name)

提示:global name 'func' is not defined
 
这样生成的结果就是:

select distinct(field1), field2 from table

因此这种处理应该可以满足你的要求。

--
I like python!
UliPad <<The Python Editor>>: http://code.google.com/p/ulipad/
UliWeb <<simple web framework>>: http://code.google.com/p/uliweb/
My Blog: http://hi.baidu.com/limodou

limodou

unread,
Feb 10, 2012, 12:53:34 AM2/10/12
to uli...@googlegroups.com
2012/2/10 asmcos (SoSE) <asm...@gmail.com>:

from sqlalchemy.sql import func

忘写了。

asmcos (SoSE)

unread,
Feb 10, 2012, 1:12:45 AM2/10/12
to uli...@googlegroups.com
懂了。 

 values 在我python 2.6 + sqlalchemy 0.5.8环境有问题。
可能是0.5.8 对with_only_columns 的解释有问题?后面丢了 from table ....

limodou

unread,
Feb 10, 2012, 1:28:46 AM2/10/12
to uli...@googlegroups.com
2012/2/10 asmcos (SoSE) <asm...@gmail.com>:

> 懂了。
>
> values 在我python 2.6 + sqlalchemy 0.5.8环境有问题。
> 可能是0.5.8 对with_only_columns 的解释有问题?后面丢了 from table ....
>

0.5.8版本太低了,至少0.6以上版本。可以考虑使用0.7版本,不过最新的0.7.5好象有点问题。

asmcos (SoSE)

unread,
Feb 10, 2012, 1:34:55 AM2/10/12
to uli...@googlegroups.com
服务器:我升级了 0.7.4 。+ python 2.6的 values还是不行
 本地: python 2.7 + 0.6的 values可以用。

算了。 我暂时用下面的方法了:
1./usr/local/lib/python2.6/dist-packages/Uliweb-0.0.1a7-py2.6.egg/uliweb/orm/__init__.py

 def distinct(self, *args, **kwargs):
        self.funcs.append(('with_only_columns', (args,), kwargs))
        return self

2. applys = Apply.all().distinct('distinct email from apply')

limodou

unread,
Feb 10, 2012, 4:14:50 AM2/10/12
to uli...@googlegroups.com
2012/2/10 asmcos (SoSE) <asm...@gmail.com>:

> 服务器:我升级了 0.7.4 。+ python 2.6的 values还是不行
> 本地: python 2.7 + 0.6的 values可以用。
>
> 算了。 我暂时用下面的方法了:
> 1./usr/local/lib/python2.6/dist-packages/Uliweb-0.0.1a7-py2.6.egg/uliweb/orm/__init__.py
>
> def distinct(self, *args, **kwargs):
> self.funcs.append(('with_only_columns', (args,), kwargs))
> return self
>
> 2. applys = Apply.all().distinct('distinct email from apply')
>

使用func.distinct会自动生成distinct(column)的形式,所以按道理来说,使用values就可以实现你说的要求的。你可以看一下生成的sql是什么样子。

Reply all
Reply to author
Forward
0 new messages