On Wed, Feb 13, 2019 at 3:22 PM Simon King <[email protected]> wrote: > > On Wed, Feb 13, 2019 at 3:13 PM <[email protected]> wrote: > > > > did not work out very well,...god, this stuff gives some good headache! > > > > >>> from sqlalchemy.ext.automap import automap_base > > >>> Base = automap_base(metadata=metadata) > > >>> Base.prepare() > > >>> WebView = Base.classes.web_view > > Traceback (most recent call last): > > File "<stdin>", line 1, in <module> > > File > > "/usr/lib64/python2.7/site-packages/sqlalchemy/util/_collections.py", line > > 212, in __getattr__ > > raise AttributeError(key) > > AttributeError: web_view > > > What does "print(Base.classes)" report at this point?
Sorry, that should probably have been "print(Base.classes.keys())" > > > > > > On Wednesday, February 13, 2019 at 4:01:25 PM UTC+1, Simon King wrote: > >> > >> It looks like you are mixing up Table objects (which are part of > >> SQLAlchemy Core) with mapped classes (part of SQLAlchemy ORM). > >> > >> The objects in metadata.tables are instances of the Table class, and > >> each correspond to a table or view in the database. The ORM allows you > >> to define classes which are mapped to those Tables, such that each > >> instance of the mapped class corresponds to a *row* in the table. > >> Flask-admin works with mapped classes (which it calls "models"), not > >> Table instances. > >> > >> Since you are reflecting the database anyway, the quickest way for you > >> to get up-and-running might be to use the Automap extension: > >> > >> https://docs.sqlalchemy.org/en/latest/orm/extensions/automap.html > >> > >> It doesn't look like "Base.prepare()" accepts an argument telling it > >> to reflect views, so you might actually need a combination of the two > >> approaches, something like this (untested): > >> > >> engine = create_engine(app.config.get('SQLALCHEMY_DATABASE_URI')) > >> metadata = MetaData(bind=engine) > >> metadata.reflect(views=True, autoload=True) > >> > >> Base = automap_base(metadata=metadata) > >> Base.prepare() > >> > >> Nodes = Base.classes.nodes > >> Attributes = Base.classes.attribs > >> Entries = Base.classes.entries > >> WebView = Base.classes.web_view > >> > >> > >> Hope that helps, > >> > >> Simon > >> > >> On Wed, Feb 13, 2019 at 2:19 PM <[email protected]> wrote: > >> > > >> > i already spent 3 days trying to map one stupid mysql view and i cant > >> > get it to work. > >> > > >> > in the python interpreter it works... > >> > > >> > Python 2.7.5 (default, May 31 2018, 09:45:54) > >> > [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2 > >> > Type "help", "copyright", "credits" or "license" for more information. > >> > >>> SQLALCHEMY_DATABASE_URI = > >> > >>> 'mysql://aix_reg:blalblabla@localhost/aix_registry' > >> > >>> from flask import Flask, request > >> > >>> from flask_sqlalchemy import SQLAlchemy > >> > >>> from sqlalchemy import String, Enum, create_engine, MetaData, Table, > >> > >>> Column, Integer > >> > >>> from sqlalchemy.orm import sessionmaker > >> > >>> from sqlalchemy.ext.declarative import declarative_base > >> > >>> from flask_admin.contrib import sqla > >> > >>> from flask_admin import Admin, expose, BaseView > >> > >>> from flask_admin.contrib.sqla import ModelView > >> > >>> from flask_admin.model.template import EndpointLinkRowAction, > >> > >>> LinkRowAction > >> > >>> Base = declarative_base() > >> > >>> engine = create_engine(SQLALCHEMY_DATABASE_URI) > >> > >>> metadata = MetaData(bind=engine) > >> > >>> Base.metadata = metadata > >> > >>> metadata.reflect(views=True, autoload=True) > >> > >>> WebView = metadata.tables['web_view'] > >> > >>> WebView > >> > Table('web_view', > >> > MetaData(bind=Engine(mysql://aix_reg:***@localhost/aix_registry)), > >> > Column('NODE_ID', INTEGER(display_width=11), table=<web_view>, > >> > server_default=DefaultClause(<sqlalchemy.sql.elements.TextClause object > >> > at 0x3fff7aace890>, for_update=False)), Column('NODE', > >> > VARCHAR(length=256), table=<web_view>), Column('LOCATION', > >> > VARCHAR(length=256), table=<web_view>), Column('IS_CLUSTER', > >> > VARCHAR(length=256), table=<web_view>), Column('MAN_SYS_NAME', > >> > VARCHAR(length=256), table=<web_view>), Column('HAS_CICS', > >> > VARCHAR(length=256), table=<web_view>), Column('OS_LEVEL', > >> > VARCHAR(length=256), table=<web_view>), Column('HAS_COBOL', > >> > VARCHAR(length=256), table=<web_view>), Column('HAS_ORACLE', > >> > VARCHAR(length=256), table=<web_view>), Column('MEM_VALUE', > >> > VARCHAR(length=256), table=<web_view>), Column('HAS_TUXEDO', > >> > VARCHAR(length=256), table=<web_view>), Column('STORAGE_VALUE', > >> > VARCHAR(length=256), table=<web_view>), Column('IS_LPM', > >> > VARCHAR(length=256), table=<web_view>), Column('HAS_SAP', > >> > VARCHAR(length=256), table=<web_view>), Column('CPU_VALUE', > >> > VARCHAR(length=256), table=<web_view>), Column('CLUSTER_RGS', > >> > VARCHAR(length=256), table=<web_view>), Column('HA_LEVEL', > >> > VARCHAR(length=256), table=<web_view>), Column('CLUSTER_NODES', > >> > VARCHAR(length=256), table=<web_view>), Column('CLUSTER_NAME', > >> > VARCHAR(length=256), table=<web_view>), Column('CPU_POOL', > >> > VARCHAR(length=256), table=<web_view>), Column('AME_FACTOR', > >> > VARCHAR(length=256), table=<web_view>), Column('SYS_PROFILE', > >> > VARCHAR(length=256), table=<web_view>), Column('INFO_MAIL', > >> > VARCHAR(length=256), table=<web_view>), Column('HOSTNAME', > >> > VARCHAR(length=256), table=<web_view>), Column('OS_TYPE', > >> > VARCHAR(length=256), table=<web_view>), Column('Java6_64', > >> > VARCHAR(length=256), table=<web_view>), Column('Java7_64', > >> > VARCHAR(length=256), table=<web_view>), Column('Java8_64', > >> > VARCHAR(length=256), table=<web_view>), Column('Java5_64', > >> > VARCHAR(length=256), table=<web_view>), Column('Java8', > >> > VARCHAR(length=256), table=<web_view>), Column('Java5', > >> > VARCHAR(length=256), table=<web_view>), Column('Java14', > >> > VARCHAR(length=256), table=<web_view>), Column('Java7', > >> > VARCHAR(length=256), table=<web_view>), Column('Java71', > >> > VARCHAR(length=256), table=<web_view>), Column('Java71_64', > >> > VARCHAR(length=256), table=<web_view>), Column('Java14_64', > >> > VARCHAR(length=256), table=<web_view>), Column('Java6', > >> > VARCHAR(length=256), table=<web_view>), Column('UPTIME', > >> > VARCHAR(length=256), table=<web_view>), Column('IP', > >> > VARCHAR(length=256), table=<web_view>), Column('IP_LONG', > >> > VARCHAR(length=256), table=<web_view>), Column('CLUSTER_NODENAME', > >> > VARCHAR(length=256), table=<web_view>), Column('RG_SERVICE_IP_LONG', > >> > VARCHAR(length=256), table=<web_view>), Column('HAS_SNA', > >> > VARCHAR(length=256), table=<web_view>), schema=None) > >> > > >> > > >> > > >> > but in the flask app no way > >> > > >> > Base = declarative_base() > >> > engine = create_engine(app.config.get('SQLALCHEMY_DATABASE_URI')) > >> > metadata = MetaData(bind=engine) > >> > Base.metadata = metadata > >> > metadata.reflect(views=True, autoload=True) > >> > > >> > Nodes = metadata.tables['nodes'] > >> > Attributes = metadata.tables['attribs'] > >> > Entries = metadata.tables['entries'] > >> > WebView = metadata.tables['web_view'] > >> > > >> > session = sessionmaker(bind=engine) > >> > > >> > > >> > admin = Admin(app, name='AIX Registry', template_mode='bootstrap3') > >> > admin.add_view(AixAdmin(Nodes, session, 'Overview')) > >> > > >> > root@lpgaixmgmtlx01:/root/flask/aix_registry>python run.py > >> > Traceback (most recent call last): > >> > File "run.py", line 3, in <module> > >> > from app import app > >> > File "/root/flask/aix_registry/app/__init__.py", line 18, in <module> > >> > from app import views > >> > File "/root/flask/aix_registry/app/views.py", line 55, in <module> > >> > admin.add_view(AixAdmin(Nodes, session, 'Overview')) > >> > File > >> > "/usr/lib/python2.7/site-packages/flask_admin/contrib/sqla/view.py", > >> > line 329, in __init__ > >> > menu_icon_value=menu_icon_value) > >> > File "/usr/lib/python2.7/site-packages/flask_admin/model/base.py", > >> > line 812, in __init__ > >> > menu_icon_value=menu_icon_value) > >> > File "/usr/lib/python2.7/site-packages/flask_admin/base.py", line 192, > >> > in __init__ > >> > self.endpoint = self._get_endpoint(endpoint) > >> > File "/usr/lib/python2.7/site-packages/flask_admin/model/base.py", > >> > line 825, in _get_endpoint > >> > return self.model.__name__.lower() > >> > AttributeError: 'Table' object has no attribute '__name__' > >> > > >> > > >> > so how can i do this highly frustrating task correctly? > >> > > >> > -- > >> > SQLAlchemy - > >> > The Python SQL Toolkit and Object Relational Mapper > >> > > >> > http://www.sqlalchemy.org/ > >> > > >> > To post example code, please provide an MCVE: Minimal, Complete, and > >> > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > >> > description. > >> > --- > >> > You received this message because you are subscribed to the Google > >> > Groups "sqlalchemy" group. > >> > To unsubscribe from this group and stop receiving emails from it, send > >> > an email to [email protected]. > >> > To post to this group, send email to [email protected]. > >> > Visit this group at https://groups.google.com/group/sqlalchemy. > >> > For more options, visit https://groups.google.com/d/optout. > > > > -- > > SQLAlchemy - > > The Python SQL Toolkit and Object Relational Mapper > > > > http://www.sqlalchemy.org/ > > > > To post example code, please provide an MCVE: Minimal, Complete, and > > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > > description. > > --- > > You received this message because you are subscribed to the Google Groups > > "sqlalchemy" group. > > To unsubscribe from this group and stop receiving emails from it, send an > > email to [email protected]. > > To post to this group, send email to [email protected]. > > Visit this group at https://groups.google.com/group/sqlalchemy. > > For more options, visit https://groups.google.com/d/optout. -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.
