简体   繁体   English

如何使用 SQL Alchemy 从 INFORMATION_SCHEMA 读取表格?

[英]How to read a table from INFORMATION_SCHEMA using SQL Alchemy?

I have table: TAX_CREDIT and I am trying to access some metadata of that table from the table: INFORMATION_SCHEMA.COLUMNS .我有表: TAX_CREDIT ,我正在尝试从表中访问该表的一些元数据: INFORMATION_SCHEMA.COLUMNS My database is SQLServer .我的数据库是SQLServer I am trying to get certain column names and check the datatypes of it for some other function. To do that, I wrote the below code to access the table: INFORMATION_SCHEMA.COLUMNS我正在尝试获取某些列名并检查它的数据类型是否有其他 function。为此,我编写了以下代码来访问该表: INFORMATION_SCHEMA.COLUMNS

import sqlalchemy as sa
from sqlalchemy import select, MetaData, Table, Column, String
from sqlalchemy.engine.reflection import Inspector

def prep_ddl(table_name: str):
    engine = sa.create_engine("mssql+pyodbc://user:pwd@server/dbname?driver=SQL+Server")
    insp = Inspector.from_engine(engine)
    metadata = MetaData()
    table = Table(table_name, metadata, Column('column_name', String), Column('data_type', String), Column('character_maximum_length', String), Column('numeric_precision', String), Column('table_name', String), autoload=True, autoload_with=engine)
    conn = engine.connect()
    s = select([table.c.column_name, table.c.data_type, table.c.character_maximum_length, table.c.numeric_precision]).where(table.c.table_name == 'TAX_CREDITED')
    result = conn.execute(s)
    for row in result:
        print(row)
    pass

if __name__ == '__main__':
    prep_ddl('INFORMATION_SCHEMA.COLUMNS')

If I run the above code, I see an error message:如果我运行上面的代码,我会看到一条错误消息:

Traceback (most recent call last):
  File "C:/Users/USERNAME/PycharmProjects/PrimaryUnique/main.py", line 23, in <module>
    prep_ddl('INFORMATION_SCHEMA.COLUMNS')
  File "C:/Users/USERNAME/PycharmProjects/PrimaryUnique/main.py", line 10, in prep_ddl
    table = Table(table_name, metadata, Column('column_name', String), Column('data_type', String), Column('character_maximum_length', String), Column('numeric_precision', String), Column('table_name', String), autoload=True, autoload_with=engine)
  File "C:\Users\USERNAME\PycharmProjects\PrimaryUnique\venv\lib\site-packages\sqlalchemy\sql\schema.py", line 555, in __new__
    table._init(name, metadata, *args, **kw)
  File "C:\Users\USERNAME\PycharmProjects\PrimaryUnique\venv\lib\site-packages\sqlalchemy\sql\schema.py", line 644, in _init
    self._autoload(
  File "C:\Users\USERNAME\PycharmProjects\PrimaryUnique\venv\lib\site-packages\sqlalchemy\sql\schema.py", line 667, in _autoload
    autoload_with.run_callable(
  File "C:\Users\USERNAME\PycharmProjects\PrimaryUnique\venv\lib\site-packages\sqlalchemy\engine\base.py", line 2214, in run_callable
    return conn.run_callable(callable_, *args, **kwargs)
  File "C:\Users\USERNAME\PycharmProjects\PrimaryUnique\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1653, in run_callable
    return callable_(self, *args, **kwargs)
  File "C:\Users\USERNAME\PycharmProjects\PrimaryUnique\venv\lib\site-packages\sqlalchemy\engine\default.py", line 469, in reflecttable
    return insp.reflecttable(
  File "C:\Users\USERNAME\PycharmProjects\PrimaryUnique\venv\lib\site-packages\sqlalchemy\engine\reflection.py", line 679, in reflecttable
    raise exc.NoSuchTableError(table.name)
sqlalchemy.exc.NoSuchTableError: INFORMATION_SCHEMA.COLUMNS

The error message says: no such table found for INFORMATION_SCHEMA.COLUMNS table.错误消息说:没有为INFORMATION_SCHEMA.COLUMNS表找到这样的表。 In INFORMATION_SCHEMA.COLUMNS , the schema is INFORMATION_SCHEMA and table is COLUMNS .INFORMATION_SCHEMA.COLUMNS中,模式是INFORMATION_SCHEMA ,表是COLUMNS If I run a query on the same table it runs.如果我在它运行的同一个表上运行查询。

select TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='some_table_name'

Edit 1: I also tried to give schema name in table and pass just 'COLUMNS' as below:编辑 1:我还尝试在table中提供架构名称并仅传递“COLUMNS”,如下所示:

table = Table(table_name, metadata, Column('column_name', String), Column('data_type', String),
                      Column('character_maximum_length', String), Column('numeric_precision', String),
                      Column('table_name', String), autoload=True, autoload_with=engine, schema='INFORMATION_SCHEMA')

Edit 2:编辑 2:

I tried a bit different in my third attempt:我在第三次尝试中尝试了一些不同的方法:

table = Table(table_name, metadata,Column('column_name', String),Column('data_type', String),Column('character_maximum_length', String),Column('numeric_precision', String), Column('table_name', String))

s = select([table.columns.column_name, table.columns.data_type, table.columns.character_maximum_length, table.columns.numeric_precision]) .where(table.columns.table_name == 'TAX_CREDITED')

But Still see the same error.但仍然看到同样的错误。

sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42S02', "[42S02] [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'INFORMATION_SCHEMA.COLUMNS'. (208) (SQLExecDirectW); [42S02] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. (8180)")
[SQL: SELECT [INFORMATION_SCHEMA.COLUMNS].column_name, [INFORMATION_SCHEMA.COLUMNS].data_type, [INFORMATION_SCHEMA.COLUMNS].character_maximum_length, [INFORMATION_SCHEMA.COLUMNS].numeric_precision 
FROM [INFORMATION_SCHEMA.COLUMNS] 
WHERE [INFORMATION_SCHEMA.COLUMNS].table_name = ?]
[parameters: ('TAX_CREDITED',)]

Am I specifying the table name wrongly anywhere?我在任何地方错误地指定了表名吗? Could anyone let me know how can I fix the issue?谁能告诉我如何解决这个问题? Any help is much appreciated.任何帮助深表感谢。

The "mssql" dialect of SQLAlchemy uses INFORMATION_SCHEMA.COLUMNS itself when performing reflection on a table, and the INFORMATION_SCHEMA.COLUMNS system view does not return information about any system views (not even itself) so SQLAlchemy cannot autoload it. SQLAlchemy 的“mssql”方言在对表执行反射时使用INFORMATION_SCHEMA.COLUMNS本身,而INFORMATION_SCHEMA.COLUMNS系统视图不返回有关任何系统视图(甚至它本身)的信息,因此 SQLAlchemy 无法自动加载它。

If you really want to pull information from the INFORMATION_SCHEMA.COLUMNS view then you will need to use textual SQL:如果你真的想从INFORMATION_SCHEMA.COLUMNS视图中提取信息,那么你将需要使用文本 SQL:

sql = sa.text(
    "SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH "
    "FROM INFORMATION_SCHEMA.COLUMNS "
    "WHERE TABLE_NAME = :tbl_name"
)
with engine.begin() as conn:
    result = conn.execute(sql, {"tbl_name": "team"}).fetchall()
    pprint(result)
    """console output:
    [('id', 'int', None),
     ('prov', 'nvarchar', 2),
     ('city', 'nvarchar', 50),
     ('team_name', 'nvarchar', 50)]
    """

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM