具有复杂匹配逻辑的sqlalchemy外键。

时间:2017-10-06 12:47:04

标签: python sql sqlalchemy

我正在尝试使用sqlalchemy构建数据库。

我有两个表:krbrfrom __future__ import print_function import numpy as np import pandas as pd import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String import sqlalchemy_utils from sqlalchemy_utils.types.ip_address import IPAddressType Base = declarative_base() ## Define the tables schema class Flow(Base): __tablename__ = 'flow' Id = Column(Integer, primary_key=True) First = Column(Integer, index=True) Protocol = Column(String(10)) Src = Column(IPAddressType, index=True) SrcPort = Column(Integer) Dst = Column(IPAddressType, index=True) DstPort = Column(Integer) GroupId = Column(Integer) Port = Column(String(10)) VPort = Column(Integer) IpTos = Column(String) VlanId = Column(String) VlanPri = Column(String) Application = Column(String(100)) Packets = Column(Integer) Messages = Column(Integer) Bytes = Column(Integer) Last = Column(Integer) #LearnedIPs alertable #LearnedIPs learned-ip # u'LearnedIPs new-ips', u'LearnedIPs subnet-name', # u'LearnedIPs timestamp-sec', u'LearnedIPs total-ips', u'SrcSubnet', # u'DstSubnet'], # 'MPLS Exp' class Krbr(Base): __tablename__ = 'krbr' Id = Column(Integer, primary_key=True) Src = Column(IPAddressType, index=True) SrcPort = Column(Integer) Dst = Column(IPAddressType, index=True) DstPort = Column(Integer) TimeNs = Column(Integer)

flow

krbr中的某些行与krbr的一行或多行相关联。

flow中的行与Src, Dst, SrcPort, DstPort中的行关联,如果:

1)它们具有相同的np.abs(Flow.first - Krbr.TimeNs/1000000000) < threshold

2)他们很接近。即spinner.setOnItemSelectListener(this);

我想知道在两个表之间创建链接的正确方法是什么。即,给定一个表的一行,我希望能够得到另一个表的行。

我不太了解sqlalchemy。我想我应该定义一个外键但我不知道如何强制执行这种复杂的关系。

1 个答案:

答案 0 :(得分:0)

以下是处理多个加入路径的示例&#39;:

from sqlalchemy import Integer, ForeignKey, String, Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Base = declarative_base()

class Customer(Base):
    __tablename__ = 'customer'
    id = Column(Integer, primary_key=True)
    name = Column(String)

    billing_address_id = Column(Integer, ForeignKey("address.id"))
    shipping_address_id = Column(Integer, ForeignKey("address.id"))

    billing_address = relationship("Address")
    shipping_address = relationship("Address")

class Address(Base):
    __tablename__ = 'address'
    id = Column(Integer, primary_key=True)
    street = Column(String)
    city = Column(String)
    state = Column(String)
    zip = Column(String)

有关&#39;处理多个加入路径的更多信息&#39;在你可以找到 SQLAlchemy 0.9 Documentation