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? > > 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.
