1

我的问题与之前的帖子非常相似(如何在 SQLAlchemy 中引用多对一关系的子对象?),但是由于我对 sqla、python 等缺乏经验,我失去了解决方案......

我有一个平面 .csv 文件(RawData),我正在尝试将此父表规范化为类似集合的子表(查找?)表,然后在 ubuntu 上使用 python2.7、sqlite3 v.3.7.7 强制引用完整性11.10。

我也意识到我的理解和命名约定也可能会导致问题,因为看起来我正试图在多对一关系的单一方面创建不同的人、机构、地点等作为孩子,除了 RawGrant 和 Grant 之间的关系,我认为应该是一对一的关系。

我有一个偷偷摸摸的怀疑,我的尝试中存在许多问题,并认为询问可能更方便,希望能治愈我的无知。

非常感谢,克里斯托弗

这是我试图遵循的上一个问题: 如何在 SQLAlchemy 中引用多对一关系的孩子?

我认为,这就是我想要做的,但我对 btw 类、表和关系的命名法感到困惑:

class Parent(Base):
    __tablename__ = 'parent'
    parent_id = Column(Integer, primary_key=True)

    # use a set
    children = relationship(Child, collection_class=set)

parent = Parent()
child = Child()
parent.children.add(child)
assert child in parent.children

这是我迄今为止的努力(下)。

很抱歉之前的帖子没有帮助...

from sqlalchemy import create_engine, MetaData, ForeignKey
from sqlalchemy import Table, Column, Integer, UnicodeText, Date
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, backref, relationship
from sqlalchemy.orm.collections import collection

Base = declarative_base()
metadata = MetaData()

class RawData(Base):
    __tablename__ = 'data'
    master_id = Column(Integer,primary_key=True, autoincrement=True)
    dataset = Column(UnicodeText)
    grant_id_rcid = Column(Integer)
    grant_id_grantor = Column(UnicodeText)
    reference_number_nih = Column(UnicodeText)
    grant_type_nih = Column(UnicodeText)
    grant_activity_code_nih = Column(UnicodeText)
    project_status = Column(UnicodeText)
    area_of_research_nih = Column(UnicodeText)
    grantor_id_nih = Column(Integer)
    recipient_id_nih = Column(Integer)
    pi_id_nih = Column(Integer)
    bmrcs = Column(UnicodeText)
    title = Column(UnicodeText)
    abstract = Column(UnicodeText)
    background = Column(UnicodeText)
    project_description = Column(UnicodeText)
    anticipated_outcomes = Column(UnicodeText)
    actual_outcomes = Column(UnicodeText)
    publications = Column(UnicodeText)
    start_date = Column(Date)
    end_date = Column(Date)
    fiscal_year = Column(Date)
    funding = Column(Integer)
    currency = Column(UnicodeText)
    department = Column(UnicodeText)
    school = Column(UnicodeText)
    city = Column(UnicodeText)
    state = Column(UnicodeText)
    data_source = Column(UnicodeText)
    data_source_org = Column(UnicodeText)
    created_by = Column(UnicodeText)
    created_date = Column(Date) 
    updated_by = Column(UnicodeText)
    updated_date = Column(Date)
    country = Column(UnicodeText)
    recipient_org_type = Column(UnicodeText)
    department_combine_name = Column(UnicodeText)
    keywords = Column(UnicodeText) 
    active = Column(UnicodeText)
    access_level = Column(UnicodeText)
    pi_fullname = Column(UnicodeText)
    pi_firstname = Column(UnicodeText)
    pi_midname = Column(UnicodeText)
    pi_surname = Column(UnicodeText)
    recipient_org_name = Column(UnicodeText)
    grantor_name = Column(UnicodeText)
    grantor_name_short = Column(UnicodeText)
    co_principal_investigator = Column(UnicodeText)
    fund_type = Column(UnicodeText)
    program_area = Column(UnicodeText)
    grant_id = Column(Integer, ForeignKey('grants.grant_id_master'), onupdate="cascade")
    grant = relationship('Grant', uselist=False, backref='data', passive_updates=False,\ cascade='all', collection_class=set)
    pi_id = Column(Integer, ForeignKey('investigators.pi_id_master'),\ onupdate="cascade")    
    pi = relationship('PI', backref='data', passive_updates=False, cascade='all',\
collection_class=set)
    grantor_id = Column(Integer, ForeignKey('grantors.grantor_id_master'),\ onupdate="cascade")
    grantor = relationship('Grantor', backref='data', passive_updates=False, cascade='all',\ collection_class=set)
    recipient_id = Column(Integer, ForeignKey('recipients.recipient_id_master'),\ onupdate="cascade")
    recipient = relationship('Recipient', backref='data', passive_updates=False,\ cascade='all', collection_class=set)
    address_id = Column(Integer, ForeignKey('addresses.address_id_master'),\ onupdate="cascade")
    address = relationship('Address', backref='data', passive_updates=False, cascade='all',\ collection_class=set)
    gac_id = Column(Integer, ForeignKey('grant_activity_codes.gac_id_master'),\ onupdate="cascade")
    gac = relationship('GAC', backref='data', passive_updates=False, cascade='all',\ collection_class=set)
    gt_id = Column(Integer, ForeignKey('grant_types.gt_id_master'), onupdate="cascade")
    gt = relationship('GT', backref='data', passive_updates=False,cascade='all',\ collection_class=set)

class Grant(Base):
##    __emulates__ = set
    __tablename__ = 'grants'
    grant_id_master = Column(Integer, primary_key=True, autoincrement=True)
    dataset = Column(UnicodeText)
    grant_id_rcid = Column(Integer)

    grant_id_grantor = Column(UnicodeText)
    reference_number_nih = Column(UnicodeText)
    bmrcs = Column(UnicodeText)
    title = Column(UnicodeText)
    abstract = Column(UnicodeText)
    start_date = Column(Date)
    end_date = Column(Date)
    fiscal_year = Column(Date)
    funding = Column(Integer)
    currency = Column(UnicodeText)
    data_source = Column(UnicodeText)
    data_source_org = Column(UnicodeText)
    fund_type = Column(UnicodeText)
    program_area = Column(UnicodeText)

##    def __init__(self):
##        self.data = set()
##    def append(self, item):
##        self.data.add(item)
##    def remove(self, item):
##        self.data.remove(item)
##    def __iter__(self):
##        return iter(self.data)

class PI(Base):
    __tablename__= "investigators"
    pi_id_master = Column(Integer, primary_key=True, autoincrement=True)
    pi_id_nih = Column(Integer)
    pi_fullname = Column(UnicodeText)
    pi_firstname = Column(UnicodeText)
    pi_midname = Column(UnicodeText)
    pi_surname = Column(UnicodeText)

class Grantor(Base):
    __tablename__= "grantors"
    grantor_id_master = Column(Integer, primary_key=True, autoincrement=True)
    grantor_id_nih = Column(Integer)
    grantor_name = Column(UnicodeText)
    grantor_name_short = Column(UnicodeText)

class Recipient(Base):
    __tablename__= "recipients"
    recipient_id_master = Column(Integer,primary_key=True, autoincrement=True)
    recipient_id_nih = Column(Integer)
    department = Column(UnicodeText)
    school = Column(UnicodeText)
    recipient_org_type = Column(UnicodeText)
    department_combine_name = Column(UnicodeText)
    recipient_org_name = Column(UnicodeText)

class Address(Base):
    __tablename__= "addresses"
    address_id_master = Column(Integer, primary_key=True, autoincrement=True)
    city = Column(UnicodeText)
    state = Column(UnicodeText)
    country = Column(UnicodeText)

class GAC(Base):
    __tablename__= "grant_activity_codes"
    gac_id_master = Column(Integer, primary_key=True, autoincrement=True)
    grant_activity_code = Column(UnicodeText)

class GT(Base):
    __tablename__= "grant_types"
    gt_id_master = Column(Integer, primary_key=True, autoincrement=True)
    grant_type = Column(UnicodeText)

data = RawData() # parent = Parent()
grants = Grant()  # child = Child()
grantors = Grantor()
recipients = Recipient()
investigators = PI()
addresses = Address()
grant_activity_codes = GAC()
grant_types = GT()
## parent.children.append(Child())

##data.grant.append(Grants())
##data.grant.append(Grantor())
##data.grant.append(Recipient())
##data.grant.append(PI())
##data.grant.append(Address())
##data.grant.append(GAC())
##data.grant.append(GT())

##data.grant.append(grants)  # parent.children.add(child)
##assert grants in data.grant # assert child in parent.children
##data.grantor.append(grantors)
##assert grantors in data.grantor
##data.recipient.append(recipients)
##assert recipients in data.recipient
##data.pi.append(investigators)
##assert investigators in data.pi
##data.address.append(addresses)
##assert addresses in data.address
##data.gac.append(grant_activity_codes)
##assert grant_activity_codes in data.gac
##data.gt.append(grant_types)
##assert grant_types in data.gt

engine = create_engine('sqlite:///cascade-empty2.db', echo=True)
Session = sessionmaker(bind=engine)
session = Session()
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
##session.add_all()
##session.commit()
4

0 回答 0