[英]How to validate table field with information from different table using sql.alchemy.orm.validates?
[英]How to read a table from INFORMATION_SCHEMA using SQL Alchemy?
我有表: TAX_CREDIT
,我正在尝试从表中访问该表的一些元数据: INFORMATION_SCHEMA.COLUMNS
。 我的数据库是SQLServer
。 我正在尝试获取某些列名并检查它的数据类型是否有其他 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')
如果我运行上面的代码,我会看到一条错误消息:
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
错误消息说:没有为INFORMATION_SCHEMA.COLUMNS
表找到这样的表。 在INFORMATION_SCHEMA.COLUMNS
中,模式是INFORMATION_SCHEMA
,表是COLUMNS
。 如果我在它运行的同一个表上运行查询。
select TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='some_table_name'
编辑 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')
编辑 2:
我在第三次尝试中尝试了一些不同的方法:
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')
但仍然看到同样的错误。
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',)]
我在任何地方错误地指定了表名吗? 谁能告诉我如何解决这个问题? 任何帮助深表感谢。
SQLAlchemy 的“mssql”方言在对表执行反射时使用INFORMATION_SCHEMA.COLUMNS
本身,而INFORMATION_SCHEMA.COLUMNS
系统视图不返回有关任何系统视图(甚至它本身)的信息,因此 SQLAlchemy 无法自动加载它。
如果你真的想从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.