【问题标题】:SQLAlchemy automap MSSQL view with no primary keySQLAlchemy 自动映射没有主键的 MSSQL 视图
【发布时间】:2018-07-11 19:33:00
【问题描述】:

我正在尝试使用 SQLAlchemy 自动映射来映射现有的 MSSQL 视图。我可以成功地自动映射一个表并对其执行查询,但是一旦我定位一个视图,它就会失败。这是我尝试过的几种不同尝试的一些代码。

  • 映射标准表适用于以下内容:

    engine = create_engine("mssql+pyodbc://username:password@serv.example.com/db?driver=ODBC+Driver+13+for+SQL+Server")
    metadata = MetaData()
    metadata.reflect(engine, only=['table_name'])
    Base = automap_base(metadata=metadata)
    Base.prepare()
    
    table = Base.classes.table_name
    
  • 使用以下内容映射视图失败

    engine = create_engine("mssql+pyodbc://username:password@serv.example.com/db?driver=ODBC+Driver+13+for+SQL+Server")
    metadata = MetaData()
    metadata.reflect(engine, only=['view_name'], views=True)
    Base = automap_base(metadata=metadata)
    Base.prepare()
    
    view = Base.classes.view_name
    

编辑:我现在尝试创建一个将唯一列映射为主键的类,但我仍然遇到错误。这是我正在尝试的。

Base.automap()

class view_name(Base):
    __tablename__ = 'view_name'
    some_id = Column('some_id', Integer, primary_key=True)

engine = create_engine("mssql+pyodbc://username:password@serv.example.com/db?driver=ODBC+Driver+13+for+SQL+Server")
metadata = MetaData()
metadata.reflect(engine, only=['view_name'], views=True)
Base.prepare()

view = Base.classes.view_name

我现在收到以下错误。

AttributeError: view_name

【问题讨论】:

  • 视图是否有一个可以标记为“主键”的唯一列?
  • 是的,该视图确实有几个独特的列。
  • 你必须define a class explicitly(只是“pk”列)并指示SQLA到use suitable candidate columns as key
  • 我用我最近的尝试修改了我的问题。你还有其他指点吗?
  • 你可以使用view_name这个类。自动映射会填补其余部分,或者至少应该这样做。

标签: python sql-server sqlalchemy


【解决方案1】:

这对我有用。

from sqlalchemy.ext.automap import automap_base
from sqlalchemy import create_engine, MetaData, Column, Integer, Table
from sqlalchemy.orm import Session

Base = automap_base()

conn_str = '...'    
engine = create_engine(conn_str)
metadata = MetaData()
# you only need to define which column is the primary key. It can automap the rest of 
the columns.
viewname = Table('view_name',metadata, Column('some_id', Integer, 
primary_key=true), autoload=True, autoload_with=engine)
Base.prepare()
view_name = Base.classes.view_name

session = Session(engine)

v1 = session.query(view_name).first()

【讨论】:

    【解决方案2】:

    对于仍然可以使其正常工作的任何人,请尝试以下操作:

    Table('view_name',Base.metadata, Column('some_id', Integer, 
    primary_key=True), autoload=True, autoload_with=engine)
    Base.prepare(engine, reflect=True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2013-12-10
      • 1970-01-01
      • 2011-02-02
      • 2013-03-26
      • 2017-06-28
      • 2018-01-15
      相关资源
      最近更新 更多