# ! /usr/bin/env python
# -*- coding: utf-8 -*-
# login_frontend.py
""" Python 2.7.3
Cherrypy 3.2.2
PostgreSQL 9.1
psycopy2 2.4.5
SQLAlchemy 0.7.10
"""
Run Code Online (Sandbox Code Playgroud)
我在一个Python/SQLAlchemy类中连接四个表时遇到问题.我正在尝试这个,所以我可以迭代这个类的实例,而不是我从连接ORM表中得到的命名元组.
为什么这一切?因为我已经开始这样了,而且我走得太远,只是离开它.此外,它必须是可能的,所以我想知道它是如何完成的.
对于这个项目(cherrypy web-frontend),我得到了一个已经完成的包含表类的模块.我把它移到了这篇文章的底部,因为也许你甚至都不需要它.
以下只是联接多表类尝试的一个示例.我选择了一个简单的案例,其中只有两个表和一个联结表.在这里,我不会写入这些连接表,但它在其他地方是必要的.这就是为什么类可以很好地解决这个问题.
这是给定的表类模块和这两个网站的示例的组合:
- 针对多个表映射类
- SQLAlchemy:一个类 - 两个表
class JoinUserGroupPerson (Base):
persons = md.tables['persons']
users = md.tables['users']
user_groups = md.tables['user_groups']
groups = md.tables['groups']
user_group_person =(
join(persons, users, persons.c.id == users.c.id).
join(user_groups, users.c.id == user_groups.c.user_id).
join(groups, groups.c.id == user_groups.c.group_id))
__table__ = user_group_person
""" I expanded the redefinition of 'id' to three tables,
and …Run Code Online (Sandbox Code Playgroud) 我创建了以下ORM:
from sqlalchemy import Column, Integer, String, UniqueConstraint
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class TableA(Base):
__tablename__ = 'table_a'
id = Column(Integer, primary_key=True, nullable=False)
identifier = Column(String(320))
internal_id = Column(Integer)
type = Column(String(32))
time = Column(DateTime(timezone=True))
success = Column(Boolean())
parameters = Column(JSONB())
class TableB(Base):
__tablename__ = 'table_b'
__table_args__ = (UniqueConstraint('generate_action',
'print_action',
name='my_action_key'),)
id = Column(Integer, primary_key=True, autoincrement=True, nullable=False)
generate_action = Column(Integer)
print_action = Column(Integer)
generate_action = Column(Integer)
coupon_code = Column(String(300))
number_of_rebought_items = Column(Integer)
seconds_between_rebuy = …Run Code Online (Sandbox Code Playgroud) 是否可以创建用于会话的视图类?
v = Table('viewname', metadata, autoload=True)
class ViewName(object):
def __init__(self, name):
self.name = name
mapper(ViewName, v)
Run Code Online (Sandbox Code Playgroud) 我可以这样创建一个临时表:
session.execute("CREATE TABLE temptable SELECT existingtable.id, "
"existingtable.column2 FROM existingtable WHERE existingtable.id<100000")
Run Code Online (Sandbox Code Playgroud)
但新表格不可读,因为它表示它没有主键. existingtable.id是exisitingtable的主要关键,所以我期望它在临时表中获得相同的处理.
但是,我宁愿找到一些ORM方式来做到这一点.鉴于:
temp_table = Table('temptable', metadata,
Column('id', Integer, primary_key=True),
Column('column2', Integer),
useexisting=True )
class TempTable(object):
pass
mapper(TempTable, temp_table)
temp_table.create(bind=session.bind, checkfirst=True)
if session.query(TempTable).delete(): #make sure it's empty
session.commit()
Run Code Online (Sandbox Code Playgroud)
如何temp_table在existingtable不执行100000 session.query.add(TempTable(...))命令的情况下填充一些选定的内容?或者有没有办法从类似上面的纯SQL版本的查询创建表?
假设我有一个模型:
class Employee(models.Model):
first_name = models.CharField(max_length=40)
last_name = models.CharField(max_length=60)
salary = models.DecimalField(decimal_places=2)
Run Code Online (Sandbox Code Playgroud)
我希望任何人都能够访问first_name和last_name但只希望某些用户能够读取工资,因为这是机密数据.
然后我想限制工资的写/更新给一个甚至不同类型的用户.
如何根据请求用户限制字段读/写/更新?
编辑:
这是在GraphQL API上下文中.我正在使用石墨烯.我想在解析器功能中看到可扩展的解决方案.
我们有一个sqlalchemy用作 ORM的应用程序。除了映射表,我们还用它来映射现有的数据库视图,效果很好。
但是,我们找不到将自定义查询映射到模型的简单方法。例如,假设我们有一个像这样的报告:
q = session.query(
Table1.field1, Table2.field2, func.sum(Table2.field3).label('sum')
).join(
Table2, Table1.id == Table2.id
).filter(
Table1.field1 == param1, Table1.field2 == param2
).group_by(
Table1.field1, Table2.field2
)
Run Code Online (Sandbox Code Playgroud)
我们想将此查询映射到一个类
class Report(CustomBaseModel):
field1 = Column(Integer, primary_key=True)
field2 = Column(Integer, primary_key=True)
sum = Column(Numeric)
Run Code Online (Sandbox Code Playgroud)
我们CustomBaseModel已经实现了很多功能,因此能够在这里使用它会减少代码重复。例如,以这种方式使用声明性基将可以将relationships定义为其他表。
当然这个例子不起作用,因为"report"数据库中没有selectable 。
我尝试__table__ = q.subquery()在Report课堂上进行设置。通过这种方式,查询可以工作,但无法定义列、关系或其他属性。也许有更好的方法来实现这一目标。
python ×6
sqlalchemy ×5
orm ×3
cherrypy ×1
django ×1
mapping ×1
postgresql ×1
python-2.7 ×1
sql ×1
view ×1