从Python的SQLAlchemy连接对象和表名字符串中获取表描述。

huangapple go评论99阅读模式
英文:

Get table description from Python sqlalchemy connection object and table name as a string

问题

从Python中的sqlalchemy连接对象和一个表名(字符串)开始,我该如何获取表格属性,例如列名和数据类型。

例如,在sqlalchemy中连接到一个数据库:

  1. from sqlalchemy import create_engine
  2. conn = create_engine('mssql+pyodbc://...driver=ODBC+Driver+17+for+SQL+Server').connect()

然后,conn是一个sqlalchemy连接对象:

  1. In [1]: conn
  2. Out[1]: <sqlalchemy.engine.base.Connection at 0x7feb6efef070>

我如何根据表名(字符串)获取表格属性,例如 table = '...'

这个应该可以工作,但实际上创建了一个空的DataFrame:

  1. from sqlalchemy import text
  2. import pandas as pd
  3. query = f"""SELECT * FROM information_schema.columns WHERE table_name='{table}'"""
  4. df = pd.read_sql_query(text(query), conn)
  1. In [2]: df
  2. Out[2]:
  3. Empty DataFrame
  4. Columns: [TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH, NUMERIC_PRECISION, NUMERIC_PRECISION_RADIX, NUMERIC_SCALE, DATETIME_PRECISION, CHARACTER_SET_CATALOG, CHARACTER_SET_SCHEMA, CHARACTER_SET_NAME, COLLATION_CATALOG, COLLATION_SCHEMA, COLLATION_NAME, DOMAIN_CATALOG, DOMAIN_SCHEMA, DOMAIN_NAME]
  5. Index: []
  1. versions:
  2. sqlalchemy - 2.0.4
  3. pandas - 1.5.3
英文:

Starting from a sqlalchemy connection object in Python and a table name as a string how do I get table properties, eg column names and datatypes.

For example, connect to a database in sqlalchemy

  1. from sqlalchemy import create_engine
  2. conn = create_engine(&#39;mssql+pyodbc://...driver=ODBC+Driver+17+for+SQL+Server&#39;).connect()

Then conn is a sqlalchemy connection object

  1. In [1]: conn
  2. Out[1]: &lt;sqlalchemy.engine.base.Connection at 0x7feb6efef070&gt;

How do I get table properties based on a table name as a string, eg table = &#39;...&#39;?

This should work but instead creates an empty DataFrame

  1. from sqlalchemy import text
  2. import pandas as pd
  3. query = f&quot;&quot;&quot;SELECT * FROM information_schema.columns WHERE table_name=&#39;{table}&#39;&quot;&quot;&quot;
  4. df = pd.read_sql_query(text(query), conn)
  1. In [2]: df
  2. Out[2]:
  3. Empty DataFrame
  4. Columns: [TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH, NUMERIC_PRECISION, NUMERIC_PRECISION_RADIX, NUMERIC_SCALE, DATETIME_PRECISION, CHARACTER_SET_CATALOG, CHARACTER_SET_SCHEMA, CHARACTER_SET_NAME, COLLATION_CATALOG, COLLATION_SCHEMA, COLLATION_NAME, DOMAIN_CATALOG, DOMAIN_SCHEMA, DOMAIN_NAME]
  5. Index: []
  1. versions:
  2. sqlalchemy - 2.0.4
  3. pandas - 1.5.3

答案1

得分: 1

  1. # 你写了
  2. conn = create_engine(...)

建议改成

  1. engine = create_engine(...)

从关系数据库动态加载细节(使用 sqlalchemy 1.4):

  1. from pprint import pp
  2. import sqlalchemy as sa
  3. engine = ...
  4. meta = sa.MetaData(bind=engine)
  5. my_table = sa.Table('my_table', meta, autoload=True)
  6. for column in my_table.c:
  7. print(column)

查看 pp(dir(my_table)) 以查看许多
其他可用的细节。
同时也可以使用 help(my_table)

此外,生成的表对象是会话
SELECT 查询、INSERT 等的非常方便的起点。


编辑

SqlAlchemy 2.0 是一个重大的变化。
文档
解释了你应该使用这个替代关键字:

  1. meta = sa.MetaData()
  2. my_table = sa.Table('my_table', meta, autoload_with=engine)
  1. <details>
  2. <summary>英文:</summary>
  3. You wrote

conn = create_engine(...)

  1. Prefer to phrase it as

engine = create_engine(...)

  1. ----
  2. Load details dynamically from the RDBMS (with sqlalchemy 1.4):

from pprint import pp
import sqlachemy as sa

engine = ...
meta = sa.MetaData(bind=engine)
my_table = sa.Table('my_table', meta, autoload=True)

for column in my_table.c:
print(column)

  1. Take a look at `pp(dir(my_table))` to see lots of
  2. other details that are available.
  3. Also `help(my_table)`.
  4. Additionally, the resulting table object is a very
  5. convenient starting place for session
  6. SELECT queries, INSERTs, and so on.
  7. ----
  8. EDIT
  9. SqlAlchemy 2.0 is a breaking change.
  10. The
    (https://docs.sqlalchemy.org/en/20/tutorial/metadata.html)
  11. explain that you should use this alternate keyword:

meta = sa.MetaData()
my_table = sa.Table('my_table', meta, autoload_with=engine)

  1. </details>

huangapple
  • 本文由 发表于 2023年4月7日 01:58:34
  • 转载请务必保留本文链接:https://go.coder-hub.com/75952446.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定