我有一个像这样的简单模型
class ChatMessage(Base):
__tablename__ = 'chat_messages'
id = Column(Integer, ForeignKey('messages.id'))
sender_id = Column(Integer, ForeignKey('users.id'))
receiver_id = Column(Integer, ForeignKey('users.id'))
Run Code Online (Sandbox Code Playgroud)
我尝试向用户添加消息关系.
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String, nullable=False)
chat_messages = relationship("ChatMessage", backref="participants",
foreign_keys="[ChatMessage.sender_id, ChatMessage.receiver_id]")
Run Code Online (Sandbox Code Playgroud)
它给:
InvalidRequestError:一个或多个映射器无法初始化 - 无法继续初始化其他映射器.原始异常是:无法确定关系User.chat_messages上的父/子表之间的连接条件 - 有多个链接表的外键路径.指定'foreign_keys'参数,提供应列为包含对父表的外键引用的列的列表.
我现在收到一个警告,BigInteger即不推荐传递参数.但是,我不确定是否有任何其他方法将值声明为unsigned.我正在存储MySQL uuid_short()函数的结果,这是一个无符号的64位整数,如果未将该列声明为,则可能会导致溢出UNSIGNED.
现在处理这个问题的正确方法是什么?
我有一个表,其中有一列整数表示type行.这些整数的范围是1 - 5.如何在SQLAlchemy中指定自定义排序顺序,例如,如果我希望按以下顺序排序行[4, 2, 3, 5, 1]?
我知道Enum数据类型,但它映射到数据库后端的VARCHAR,并且不能更改架构.
首先,我是Python的新手.
现在已经不在了.我正在尝试访问2个不同数据库上的数据并在一个视图上显示信息.
这个^在第一段之后似乎不完整.我有第一个数据库工作和完成,它工作得很好.现在我正在尝试合并第二个数据库.
如果我有第二个数据库,我无法找到我的development.ini文件应该是什么样子.我有这个:
sqlalchemy.url = mssql+pyodbc://[databasestuffsredacted]
Run Code Online (Sandbox Code Playgroud)
我想到了类似的东西
db2 = mssql+pyodbc://[seconddbstuffsredacted]
Run Code Online (Sandbox Code Playgroud)
(两个数据库使用相同的类型和驱动程序)从先前的堆栈溢出问题,这被提到:
DBSession2 = orm.scoped_session(orm.sessionmaker(extension=ZTE())
Run Code Online (Sandbox Code Playgroud)
但是,世界上如何与我的第二个数据库进行对话.我错过了一个关键的部分,我认为应该在第一段之后的上述文件中.
例如,在Django中有一个repo:https://sourcegraph.com/github.com/dcwatson/django-pgcrypto.
SQLAlchemy手册中有一些讨论,但我使用的是非字节列:http://docs.sqlalchemy.org/en/rel_0_9/core/types.html
我正在使用SQLAlchemy在Heroku上运行Flask.
一个代码示例和/或一些讨论将是最受欢迎的.
我必须直接查询关系,因为我必须单独显示它们.
task_user = db.Table(
'pimpy_task_user',
db.Column('task_id', db.Integer, db.ForeignKey('pimpy_task.id')),
db.Column('user_id', db.Integer, db.ForeignKey('user.id'))
)
Run Code Online (Sandbox Code Playgroud)
我如何在SQLAlchemy中执行此操作?当我尝试这个:
tasks_rel = task_user.join(Task).join(User).filter(Task.group_id == group_id)
Run Code Online (Sandbox Code Playgroud)
它会导致此错误:
AttributeError: 'Join' object has no attribute 'filter'
Run Code Online (Sandbox Code Playgroud) 我在postgresql中有两个表,一个名为ip_address,另一个名为network.
该ip_address表有两列:
id 是一个 INTEGERv4address 是一个 INET该network表有两列:
id 是一个 INTEGERv4representation 是一个 CIDR我希望能够选择ip_address并急切加载ip_addresses network(s),而无需id在表之间定义基于外键的关系.这些id列由与其他表无关的其他关系使用.
完成此任务的SQL是:
select * from ip_address join network on ip_address.v4address << network.v4representation;
Run Code Online (Sandbox Code Playgroud)
在postgresql中,<<运算符可用于比较a INET和a CIDR.它将匹配INET包含在其中的行CIDR.
我可以property在我的IPAddress模型上定义一个可以完成此任务的模型:
@property
def networks(self):
query = session.query(Network)
query = query.filter("v4representation >> :v4addr").params(v4addr=self.v4address)
return query.all()
Run Code Online (Sandbox Code Playgroud)
这有效,但是当我真正尝试property在应用程序中使用它时,我遇到了典型的"N + 1"查询问题.我想以这样的方式定义它,以便能够急于加载IP地址网络.
我试图将其定义为relationship …
我有以下内容:
@periodic_task(run_every=crontab(minute="*/1"))
def PeriodicUpdateAgentLastRica():
query = """update agents
inner join
(select sims.consignment_agents_id as agents_id,
MAX(sims.rica_current_stamp)
as last_rica_stamp
from sims
where sims.rica_current_stamp > DATE_SUB(now(), INTERVAL 3 MONTH) and sims.consignment_agents_id is not NULL
group by sims.consignment_agents_id) as dt on dt.agents_id = agents.id
set agents.last_rica_stamp = dt.last_rica_stamp"""
res = Session.execute(query)
print res
if res.rowcount:
log.info("Updated %s agents" % res.rowcount)
#transaction.commit()
Run Code Online (Sandbox Code Playgroud)
当我运行时celery worker -B这是返回的内容:
[2014-02-12 09:15:00,012: INFO/MainProcess] Received task: prepaid.models.Prepaid.PeriodicUpdateAgentLastRica[9ca091c8-595f-4163-8ddf-2742e573b90c]
[2014-02-12 09:15:01,812: WARNING/Worker-7] <sqlalchemy.engine.result.ResultProxy object at 0x776f310>
[2014-02-12 09:15:01,813: INFO/Worker-7] Updated 2923 …Run Code Online (Sandbox Code Playgroud) 我有以下加入:
user = User.query.join(UserEmail).filter_by(address = js['email'].lower()).first()
Run Code Online (Sandbox Code Playgroud)
它有效,但我也想在结果行中使用UserEmail
我怎么做到这一点?
我有一个声明性的类结构,如下所示:
class BaseClass(Base):
Column A
Column B
class Mixin(object):
Column C
class ItemA(BaseClass):
Column D
class ItemB(Mixin, BaseClass):
pass
class ItemC(Mixin, BaseClass):
Column E
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以with_polymorphic使我基于Column C所有对象进行查询Items,而不必明确知道自己Item拥有什么?本质上有点像
mixin_poly = with_polymorphic(base = BaseClass, classes = MixinClass.__subclasses__())
Run Code Online (Sandbox Code Playgroud)
假设在导入时,在声明MixinClass之前,所有的导数都已导入with_polymorphic。
编辑 注意,我已经省略了连接表继承的样板,但是假设它已经正确设置,可以执行
poly_base = with_polymorphic(base = BaseClass, classes = '*')
session.query(poly_base).filter(BaseClass.a == value, ...)
Run Code Online (Sandbox Code Playgroud)
执行预期的查询列BaseClass。关键是能够查询Mixin以相同方式继承该类的子类中的公共列。
sqlalchemy ×10
python ×9
mysql ×2
postgresql ×2
pyramid ×2
flask ×1
heroku ×1
join ×1
orm ×1
pgcrypto ×1
sql ×1
transactions ×1