SQLAlchemy自动化MSSQL视图,没有主键

时间:2018-02-01 12:59:36

标签: python sql-server sqlalchemy

我正在尝试使用SQLAlchemy automap来映射现有的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

2 个答案:

答案 0 :(得分:2)

这对我有用。

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()

答案 1 :(得分:1)

对于仍然可以使用它的任何人,请尝试以下操作:

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