在SQLAlchemy中,我们可以像这样声明表及其关系:
user = Table(
'users', metadata,
Column('id', Integer, primary_key=True))
address = Table(
'adresses', metadata,
Column('id', Integer, primary_key=True),
Column('user_id', Integer, ForeignKey('user.id')))
class User(object): pass
class Address(object): pass
session.mapper(User, user, properties=dict(
'address' = relation(Address, backref='user', cascade="all")))
Run Code Online (Sandbox Code Playgroud)
(请注意上面一行中的级联关系.)
但是,我们也可以使用一种称为声明式样式的替代速记样式,在这种样式中我们可以用更少的代码行表达相同的东西,省略mapper()关系:
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
class Adress(Base):
__tablename__ = 'adresses'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('user.id')))
Run Code Online (Sandbox Code Playgroud)
但是,如果我们使用这种声明式样式,是否有另一种方法来定义级联关系?
是否有更有效的方法来执行以下操作?我更感兴趣的是知道是否有办法设置"mylist"以匹配任何东西,如果day等于'all',因为在其他情况下,"mylist"可以包含更多元素.
if day == 'all':
mylist = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday']
else:
mylist = [day] # day equal to one of the above
records = meta.Session.query(Transaction).filter(Transaction.day.in_(mylist)).all()
Run Code Online (Sandbox Code Playgroud) 使用SQLAlchemy时,我使用session.add(objname)向会话添加一个对象,然后使用session.flush显式刷新它,或者在创建引擎本身时启用autoflush = True.
现在在会话中,如果想通过session.query(classname).all()返回该对象,我无法检索它.
为什么会这样?或者有没有一种方法,query()也可以检索刷新的对象.
假设我有一个表"节点",我存储一棵树.每个节点都有一个主键id和一个parent_id列.当然,我想访问每个节点实例的父属性,即关系.有人可能会尝试:
import sqlalchemy, sqlalchemy.orm, sqlalchemy.ext.declarative
engine = sqlalchemy.create_engine('sqlite:///PATHTOMYDATABASE', echo=True)
Base = sqlalchemy.ext.declarative.declarative_base()
class Node(Base):
__tablename__ = "nodes"
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
parent_id = sqlalchemy.Column(sqlalchemy.Integer, sqlalchemy.ForeignKey("nodes.id"))
parent = sqlalchemy.orm.relationship("Node", backref=sqlalchemy.orm.backref("childs"))
Base.metadata.create_all(engine)
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,我收到一个错误:
sqlalchemy.exc.InvalidRequestError: Table 'nodes' is already defined for this MetaData instance. Specify 'useexisting=True' to redefine options and columns on an existing Table object.
我不明白我可以在什么时候设置这个选项'useexisting=True'.这是正确的方法吗?
编辑:事实上,错误来自原始脚本的另一部分.如果用临时数据库替换数据库路径:memory:,它可以正常工作.感谢TokenMacGuy.
因此,上面的例子可以被视为一个工作示例.
我使用Python和Sqlalchemy在Sqlite数据库中存储纬度和经度值.我为Location对象创建了一个混合方法,
@hybrid_method
def great_circle_distance(self, other):
"""
Tries to calculate the great circle distance between the two locations
If it succeeds, it will return the great-circle distance
multiplied by 3959, which calculates the distance in miles.
If it cannot, it will return None.
"""
return math.acos( self.cos_rad_lat
* other.cos_rad_lat
* math.cos(self.rad_lng - other.rad_lng)
+ self.sin_rad_lat
* other.sin_rad_lat
) * 3959
Run Code Online (Sandbox Code Playgroud)
所有值都是cos_rad_lat和sin_rad_lat我预先计算的值,以优化计算.无论如何,当我运行以下查询时,
pq = Session.query(model.Location).filter(model.Location.great_circle_distance(loc) < 10)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误,
line 809, in great_circle_distance
* math.cos(self.rad_lng - other.rad_lng) …Run Code Online (Sandbox Code Playgroud) 目前InstrumentedList我的金字塔应用程序中代表了一对多的关系.这种关系以下列方式构建:
Class project:
submissions = relationship('Submission', backref='project')
Run Code Online (Sandbox Code Playgroud)
我想迭代项目列表中的每个提交.但是,我希望我的提交按时间戳(datetime对象)排序
这是我现在迭代我的提交的方式:
for project in projects:
for submission in project.submissions:
# Do some stuff with each submission here
Run Code Online (Sandbox Code Playgroud)
问题是每当重新加载应用程序时,每个项目的提交顺序都会发生变化.我需要订单一致并按时间戳排序,我该怎么做呢?
一个例子使用aliased:
>>> from sqlalchemy import func
>>> ua = aliased(User)
>>> q = q.from_self(User.id, User.name, ua.name).\
... filter(User.name < ua.name).\
... filter(func.length(ua.name) != func.length(User.name))
Run Code Online (Sandbox Code Playgroud)
但是在0.6.1中不起作用:
>>> from sqlalchemy import func
>>> ua = aliased(User)
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
ua = aliased(User)
NameError: name 'aliased' is not defined
>>> ua = aliased(User)
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
ua = aliased(User)
NameError: name 'aliased' is …Run Code Online (Sandbox Code Playgroud) 作为python的新手,我不太清楚为什么我会得到不一致的结果.我注册了一个用户,我的表中的密码最终成为哈希版本.当用户更新其密码时,表中的密码最终为未散列的版本.显然,我想要哈希版本.我究竟做错了什么?(如果重要的话,我正在使用SQLAlchemy和mysql.)
我有以下内容:
def hash_password(password):
blah, blah, blah # hash my password here
return hashed_password
class User(Base):
__tablename__ = 'mytable'
email = Column('email')
_password = Column('password')
def _get_password(self):
return self._password
def _set_password(self, password):
self._password = hash_password(password)
password = property(_get_password, _set_password)
password = synonym('_password', descriptor=password)
def __init__(self, password="", email=""):
self.email = email
self.password = password
@classmethod
def register(cls, email, password):
return DBSession.add(User(email=email,password=password)) # this correctly hashes the password
@classmethod
def update(cls, email, password):
return DBSession.query(cls).filter(cls.email == email).update({'password': password}) #password ends up being …Run Code Online (Sandbox Code Playgroud) SELECT sector.sector, count(*)
FROM reports, organization, sector
WHERE reports.org_id = organization.id
AND organization.id = sector.org_id
GROUP BY sector.sector;
Run Code Online (Sandbox Code Playgroud)
老实说,我甚至不确定从哪里开始表达这个GROUP BY并加入sqlalchemy.
在SQLAlchemy中,如果你在查询中放一个逗号,如下所示,你会得到一个"字符串".如果你没有逗号,你会得到一个元组.为什么会这样?我看不到文档中解释的任何地方
使用SQLAlchemy0.8
以下代码返回一个字符串:
def get_password(self, member_id):
for password, in session.query(Member.__table__.c.password).filter(self.__table__.c.id == member_id):
return password
Run Code Online (Sandbox Code Playgroud)
这将返回一个类'str': 'mypassword'
虽然下面的代码返回一个元组;
def get_password(self, member_id):
for password in session.query(Member.__table__.c.password).filter(self.__table__.c.id == member_id):
return password
Run Code Online (Sandbox Code Playgroud)
这将返回一个类'sqlalchemy.util._collections.KeyedTuple':('mypassword',)
sqlalchemy ×10
python ×7
pyramid ×2
database ×1
foreign-keys ×1
orm ×1
postgresql ×1
pylons ×1
sql ×1
sqlite ×1