2017-10-06 13 views
0

私はsqlalchemyでデータベースを構築しようとしています。sqlalchemy複合一致論理を持つ外部キー。

私は2つのテーブル:flowkrbrを持っています。 flowの行のいくつかに

from __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) 

krbrの1つ以上の行に関連付けられています。

1)それらはSrc, Dst, SrcPort, DstPort

2)は、時間的に接近しているのと同じ値を持っている:場合

krbrの行はflowの行に関連付けられています。すなわちnp.abs(Flow.first - Krbr.TimeNs/1000000000) < threshold

私は2つのテーブルの間にリンクを作成する正しい方法が何であるか疑問に思っています。すなわち、1つのテーブルの行が与えられ、他のテーブルの行を取得できるようにしたいとします。

私はsqlalchemyについて詳しくは分かりません。私は外部キーを定義すべきだと思いますが、そのような複雑な関係をどのように実行するのか分かりません。ここで

+1

で見つけることができる私はファジー外部キーを考えていませんあなたがポイント2で示唆しているようなロジックが可能です - 外部キーは別のテーブル内の行を一意に識別する必要があります –

+0

それを行う正しい方法は、 'Src:SrcPort_Dst:DstPort_time_interval'として定義された各テーブルに新しいカラムを作成することですその列を外部キーとして使用する – Donbeo

答えて

0

は、「複数の結合パスの処理」のサンプルです:あなたの中に「複数の結合パスの取り扱い」について

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) 

詳細情報は SQLAlchemy 0.9 Documentation

+1

これは、mappe中に発生しますr構成時間。関係が使用する外部キーをSQLAに伝えることは何もありません。 'foreign_keys'引数を' relationship() 'に渡す必要があります。 –

関連する問題