【问题标题】:How to join-query without sqlalchemy ORM relationships如何在没有 sqlalchemy ORM 关系的情况下加入查询
【发布时间】:2020-09-14 05:57:37
【问题描述】:

我为此苦苦挣扎。我来自 php/mysql,在其中可以轻松执行如下查询:

SELECT Work_center, ... , MRPW, WCC.Total_Cost FROM tracking LEFT JOIN WCC ON WCC.Well_Type_Code = tracking.PDO_Well_Type

但是现在使用 python、postgresql 和 sqlalchemy,它给了我这个错误:

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedTable) relation "wcc" does not exist
LINE 1: ...uit, MRPW, WCC.Total_Cost FROM tracking LEFT JOIN WCC ON WCC...

它要求我提供关系,而关系要求我提供外键,但这里没有外键。我不想链接这两个表。虽然我尝试这样做,但它让我很难过,因为这两个表的数据来自 csv 文件上传。如何使用没有关系和外键的连接进行查询? 知道我花了几个小时搜索和尝试,但似乎没有用!

class WCC(Base):
    __tablename__ = "WCC"
    __table_args__ = {'extend_existing': True} 

    id =                  Column(Integer, primary_key=True, index=True)
    Well_Type_Code =      Column(String, index=True)
    Well_Type_Code_year = Column(String, index=True, unique=True)
    Year =                Column(Integer)
    Total_Cost =          Column(Float)
    #wells = relationship("tracking", back_populates="WCC",foreign_keys=[Well_Type_Code], primaryjoin="tracking.PDO_Well_Type == WCC.Well_Type_Code")


class tracking(Base):
    __tablename__ = "tracking"
    __table_args__ = {'extend_existing': True} 

    id =                  Column(Integer, primary_key=True, index=True)
    Work_center =         Column(String)
    Operation_Short =     Column(String)
    Oper_Act =            Column(String)
    Opr_System_status =   Column(String)
    Earl_start_date =     Column(DateTime)
    EarliestEndDate =     Column(DateTime)
    Station_Code =        Column(String)
    Normal_duration =     Column(Float)
    Norm_duratn_un=       Column(String)
    Well_Name=            Column(String)
    Field =               Column(String)
    Responsible_asset =   Column(String)
    Well_ID =             Column(Integer, unique=True, index=True)
    Well_Location=        Column(String)
    Well_Function=        Column(String)
    Well_Category=        Column(String)
    PCAP_Category=        Column(String)
    Move_days=            Column(Float)
    PDO_Well_Type=        Column(String)

    pick_date =           Column(DateTime)
    pick_date_spud =      Column(DateTime)
    PI_date =             Column(DateTime)
    PI_date_spud =        Column(DateTime)
    location =            Column(Float)
    location_date =       Column(DateTime)
    location_date_spud =  Column(DateTime)
    HUA_date =            Column(DateTime)
    HUA_date_spud =       Column(DateTime)
    WPT_final_date =      Column(DateTime)
    WPT_final_date_spud = Column(DateTime)
    WPT_highlights      = Column(String)
    expected_comm_date  = Column(DateTime)
    commissioning_date  = Column(DateTime)
    EWS_date  =           Column(DateTime)
    cond_conduit=         Column(Text)
    gas_conduit=          Column(Text)
    MRPW=                 Column(Text)
    #cost = relationship("WCC", back_populates="tracking",primaryjoin="tracking.PDO_Well_Type == WCC.Well_Type_Code")

【问题讨论】:

  • 能否请您提供导致该错误的查询?

标签: postgresql sqlalchemy


【解决方案1】:

在 Postgres 中,对象名称在双引号时区分大小写,并且您必须始终将它们双引号。看起来该表在创建时是双引号,但在查询中引用时不是:

class WCC(Base):
    __tablename__ = "WCC"

but 
 LEFT JOIN WCC ON 

表名“WCC”与 WCC 不同。尝试从创建表的位置删除双引号。如果由于您的 ORM 而无法做到这一点,那么请在查询本身上加上双引号。但请记住,您必须在每个参考文献上加双引号。尽可能避免使用双引号,任何感知到的好处都是不值得的。

【讨论】:

  • 我必须将所有大写字母的表/列名双引号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 2012-08-17
  • 2018-03-10
  • 1970-01-01
相关资源
最近更新 更多