私はsqlalchemyでデータベースを構築しようとしています。sqlalchemy複合一致論理を持つ外部キー。
私は2つのテーブル:flow
とkrbr
を持っています。 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について詳しくは分かりません。私は外部キーを定義すべきだと思いますが、そのような複雑な関係をどのように実行するのか分かりません。ここで
で見つけることができる私はファジー外部キーを考えていませんあなたがポイント2で示唆しているようなロジックが可能です - 外部キーは別のテーブル内の行を一意に識別する必要があります –
それを行う正しい方法は、 'Src:SrcPort_Dst:DstPort_time_interval'として定義された各テーブルに新しいカラムを作成することですその列を外部キーとして使用する – Donbeo