我有一个班级:
from sys import stderr
from elixir import *
from types import *
class User(Entity):
using_options(tablename="users")
first_name = Field(String(50))
middle_name = Field(String(50))
last_name = Field(String(50))
def __get_name__ (self):
first_name = self.first_name if self.first_name is not None else ""
middle_name = self.middle_name if self.middle_name is not None else ""
last_name = self.last_name if self.last_name is not None else ""
return " ".join((first_name, middle_name, last_name)).strip()
def __set_name__ (self,string):
first_name = ""
middle_name = ""
last_name = ""
split_string = string.split(' ')
if len(split_string) == 1:
first_name = string
elif len(split_string) == 2:
first_name, last_name = split_string
elif len(split_string) == 3:
first_name, middle_name, last_name = split_string
else: #len(split_string) > 3:
first_name = split_string[0]
last_name = split_string[-1]
middle_name = " ".join(split_string[1:-2])
self.first_name = first_name
self.middle_name = middle_name
self.last_name = last_name
name = property(__get_name__,__set_name__)
我想按如下方式运行查询:
def get_user(user):
found = None
if type(user) in [IntType,StringType]:
if type(user) is StringType:
where = or_(User.first_name==user,
User.middle_name==user,
User.last_name==user,
User.name==user)
qry = User.query.filter(where)
elif type(user) is IntType:
where = or_(User.id==user,
User.employee_id==user)
qry = User.query.filter(where)
try:
found = qry.one()
except NoResultFound:
print >> stderr, "Couldn't find '%s'" % user
elif type(user) == User:
found=user
return found
但是,生成的SQL查询类似于以下内容:
SELECT users.first_name AS users_first_name,
users.middle_name AS users_middle_name,
users.last_name AS users_last_name
FROM users
WHERE users.first_name = 'Joseph'
OR users.middle_name = 'M'
OR users.last_name = 'Schmoe'
OR false
请注意' false '代替User.name字段。
我收到了这个错误:
sqlalchemy.exc.OperationalError: (OperationalError) no such column: false
我认为我希望SQL查询看起来如下:
SELECT users.name
FROM users
WHERE users.name = 'Joseph M Schmoe'
编辑:所需/第二个SQL查询对于我真正想要的东西是不正确的:在数据库中创建一个'name'字段的某种被动方式,对应于'first_name','middle_name','last_name的连接”。
Edit2:我相信以下内容会让我几乎到处。但是,我仍然在努力正确表达。
Edit3:看起来它适用于我需要它做的事情。所以我把它作为答案包括在内。
答案 0 :(得分:2)
您正在定义属性,并且在分配对象后将可用。
注意:为方便起见,我更改了代码
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, DateTime, String
from datetime import datetime
Base = declarative_base()
class User(Base):
first_name = Column('first_name', String)
middle_name = Column('middle_name', String)
last_name = Column('last_name', String)
def __get_name__ (self):
first_name = self.first_name if self.first_name is not None else ""
middle_name = self.middle_name if self.middle_name is not None else ""
last_name = self.last_name if self.last_name is not None else ""
return " ".join((first_name, middle_name, last_name)).strip()
def __set_name__ (self,string):
first_name = ""
middle_name = ""
last_name = ""
split_string = string.split(' ')
if len(split_string) == 1:
first_name = string
elif len(split_string) == 2:
first_name, last_name = split_string
elif len(split_string) == 3:
first_name, middle_name, last_name = split_string
else: #len(split_string) > 3:
first_name = split_string[0]
last_name = split_string[-1]
middle_name = " ".join(split_string[1:-2])
self.first_name = first_name
self.middle_name = middle_name
self.last_name = last_name
name = property(__get_name__,__set_name__)
所以first_name, middle_name and last_name
是Class属性。定义属性时,它需要该对象的实例。
In [13]: User.first_name
Out[13]: Column('first_name', String(), )
In [14]: User.name
Out[14]: <property object at 0x26fef70>
在上面的例子中,您可以看到差异。在您设置该属性或该属性的任何字段之前,它将始终为空。
你必须提供
In [16]: u1 = User()
In [17]: u1.name = "first middle last"
In [18]: u1.name
Out[18]: 'first middle last'
In [19]: u1.first_name
Out[19]: 'first'
在此之后你可以使用属性。
这有助于您了解您的问题。 您的媒体资源与您无法按班级访问的实例相关联。
答案 1 :(得分:2)
from sqlalchemy.ext.hybrid import hybrid_property
@hybrid_property
def name (self):
first_name = self.first_name if self.first_name is not None else ""
middle_name = self.middle_name if self.middle_name is not None else ""
last_name = self.last_name if self.last_name is not None else ""
return " ".join((first_name, middle_name, last_name)).strip()
@name.setter
def name (self,string):
first_name = ""
middle_name = ""
last_name = ""
split_string = string.split(' ')
if len(split_string) == 1:
first_name = string
elif len(split_string) == 2:
first_name, last_name = split_string
elif len(split_string) == 3:
first_name, middle_name, last_name = split_string
else: #len(split_string) > 3:
first_name = split_string[0]
last_name = split_string[-1]
middle_name = " ".join(split_string[1:-2])
self.first_name = first_name
self.middle_name = middle_name
self.last_name = last_name
表达部分在这里:
@name.expression
def name (cls):
f = cls.first_name
m = cls.middle_name
l = cls.last_name
return f+' '+m+' '+l