使用外键映射使用Python和SQLAlchemy从另一个表中获取数据
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用外键映射使用Python和SQLAlchemy从另一个表中获取数据,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2809字,纯文字阅读大概需要5分钟。
内容图文
![使用外键映射使用Python和SQLAlchemy从另一个表中获取数据](/upload/InfoBanner/zyjiaocheng/907/8924458b160d4f448fe6271b0527cd74.jpg)
嗯,标题比我想象的更难制定.
基本上,我使用SQLAlchemy将这些简单的类映射到表.我知道他们缺少一些项目,但这些并不是突出问题所必需的.
class Customer(object):
def __init__(self, uid, name, email):
self.uid = uid
self.name = name
self.email = email
def __repr__(self):
return str(self)
def __str__(self):
return "Cust: %s, Name: %s (Email: %s)" %(self.uid, self.name, self.email)
以上基本上是一个简单的客户,其ID,姓名和电子邮件地址.
class Order(object):
def __init__(self, item_id, item_name, customer):
self.item_id = item_id
self.item_name = item_name
self.customer = None
def __repr__(self):
return str(self)
def __str__(self):
return "Item ID %s: %s, has been ordered by customer no. %s" %(self.item_id, self.item_name, self.customer)
这是仅包含订单信息的Orders类:id,名称和对客户的引用.它被初始化为None表示此商品还没有客户.代码的工作将为客户分配项目.
以下代码将这些类映射到相应的数据库表.
# SQLAlchemy database transmutation
engine = create_engine('sqlite:///:memory:', echo=False)
metadata = MetaData()
customers_table = Table('customers', metadata,
Column('uid', Integer, primary_key=True),
Column('name', String),
Column('email', String)
)
orders_table = Table('orders', metadata,
Column('item_id', Integer, primary_key=True),
Column('item_name', String),
Column('customer', Integer, ForeignKey('customers.uid'))
)
metadata.create_all(engine)
mapper(Customer, customers_table)
mapper(Order, orders_table)
现在,如果我做了类似的事情:
for order in session.query(Order):
print order
我可以获得这种形式的订单清单:
Item ID 1001: MX4000 Laser Mouse, has been ordered by customer no. 12
我想要做的是找出客户12的名称和电子邮件地址(这就是我将ForeignKey用于Customer表的原因).我该怎么办呢?
根据我的评论更新
我知道这似乎有点无用,但仅仅是为了知道:我必须做些什么来保持关系的单向性?
另外,如果我有另一个外键进入另一个表?我该如何更新映射器?
解决方法:
首先,如果您确实将客户传递给Order constructur,那么至少要使用它.
我建议使用默认值,但仍允许在创建时分配给客户,如下所示:
class Order(object):
def __init__(self, item_id, item_name, customer=None):
self.item_id = item_id
self.item_name = item_name
self.customer = customer # self.customer = None
#...
为了让您的关系发挥作用,您必须初始化关系
对象之间,FK是不够的.我建议你改变你的代码如下(摘录):
orders_table = Table('orders', metadata,
Column('item_id', Integer, primary_key=True),
Column('item_name', String),
Column('customer_id', Integer, ForeignKey('customers.uid')) # changed
)
# for bi-directional relationship use:
mapper(Customer, customers_table, properties={
'orders': relationship(Orders, backref='customer')
})
mapper(Orders, orders_table)
# for uni-directional relationship use:
mapper(Customer, customers_table)
mapper(Orders, orders_table, properties={
'customer': relationship(Customer)
})
#...
然后,您可以从订单导航到客户,然后返回:
print mycustomer.orders # in case of bi-directional
print order.customer
内容总结
以上是互联网集市为您收集整理的使用外键映射使用Python和SQLAlchemy从另一个表中获取数据全部内容,希望文章能够帮你解决使用外键映射使用Python和SQLAlchemy从另一个表中获取数据所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。