【问题标题】:List names of all available MS SQL databases on server using python使用 python 列出服务器上所有可用 MS SQL 数据库的名称
【发布时间】:2016-04-02 21:02:42
【问题描述】:

尝试使用 Python 列出远程 MS SQL 服务器上的数据库名称(就像 MS SQL Server Management Studio 中的对象资源管理器)。

当前解决方案:所需查询为SELECT name FROM sys.databases;。所以目前的解决方案是使用 SQLAlchemy 和 Pandas,如下所示。

import pandas    
from sqlalchemy import create_engine
#database='master'
engine = create_engine('mssql+pymssql://user:password@server:port/master')
query = "select name FROM sys.databases;"
data = pandas.read_sql(query, engine)

输出:

                  name
0               master
1               tempdb
2                model
3                 msdb

问题:如何使用 SQLAlchemy 的inspect(engine) 类似于在数据库下列出表名?或者没有导入熊猫的任何更简单的方法?

from sqlalchemy import inspect

#trial 1: with no database name
engine = create_engine('mssql+pymssql://user:password@server:port')
#this engine not have DB name
inspector = inspect(engine)
inspector.get_table_names() #returns []
inspector.get_schema_names() #returns [u'dbo', u'guest',...,u'INFORMATION_SCHEMA']

#trial 2: with database name 'master', same result
engine = create_engine('mssql+pymssql://user:password@server:port/master')
inspector = inspect(engine)
inspector.get_table_names() #returns []
inspector.get_schema_names() #returns [u'dbo', u'guest',...,u'INFORMATION_SCHEMA']

【问题讨论】:

  • 它们应该存在于inspector.get_table_names();你试过print(inspector.get_table_names())吗?
  • 谢谢!已经试过了。这确实会返回数据库名称下的表名,但不会返回服务器中的数据库名称。
  • 天啊!在这个假期里,我的大脑显然被关闭了,完全误读了这个问题。我猜在 SQL Server get_schema_names() 中是行不通的,因为你只会得到 dbos 的列表?值得一试;我手边没有 SQL Server 装备,或者我会做一些测试(本周下班)。
  • get_schema_names() 为两个不同的服务器返回相同的结果。所以猜测它显示了服务器的默认构建块,而不是我想要的内部数据库名称。用更多信息编辑了问题
  • 我认为您的代码块中的意思是 get_schema_names 而不是 get_table_names

标签: python sql-server database sqlalchemy pymssql


【解决方案1】:

如果您真正想做的只是避免导入熊猫,那么以下方法对我来说很好:

from sqlalchemy import create_engine
engine = create_engine('mssql+pymssql://sa:saPassword@localhost:52865/myDb')
conn = engine.connect()
rows = conn.execute("select name FROM sys.databases;")
for row in rows:
    print(row["name"])

生产

master
tempdb
model
msdb
myDb

【讨论】:

  • 谢谢! engine.connect().execute(...) 有效,即使在 create_engine() 中没有提供端口和数据库名称!
【解决方案2】:

这是另一种逐行获取的解决方案:

import pymssql
connect = pymssql.connect(server, user, password, database)
cursor = connect.cursor(as_dict=True)
row = cursor.fetchone()
while row:
    for r in row.items():
        print r[0], r[1]
    row = cursor.fetchone()

【讨论】:

    【解决方案3】:

    我相信以下 sn-p 将列出您选择连接的任何服务器上可用数据库的名称。这将返回一个 JSON 对象,该对象将显示在您的浏览器中。这个问题有点老了,但我希望这对任何好奇的人有所帮助。

    from flask import Flask, request
    from flask_restful import Resource, Api
    from sqlalchemy import create_engine, inspect
    from flask_jsonpify import jsonify
    
    engine = create_engine('mssql+pymssql://user:password@server:port/master')
    
    class AllTables(Resource):
        def get(self):
            conn = engine.connect()
            inspector = inspect(conn)
            tableList = [item for item in inspector.get_table_names()]
            result = {'data': tableList}
            return jsonify(result)
    
    api.add_resource(AllTables, '/alltables')
    
    app.run(port='8080')
    

    【讨论】:

      【解决方案4】:

      还可以通过使用以下驱动程序执行单个查询从特定方案中获取表:DB-API interface to Microsoft SQL Server for Python

      pip install pymssql
      
      import pymssql
      
      # Connect to the database
      conn = 
      pymssql.connect(server='127.0.0.1',user='root',password='root',database='my_database')
      
      # Create a Cursor object
      cur = conn.cursor()
      
      # Execute the query: To get the name of the tables from my_database
      cur.execute("select table_name from information_schema.tables") # where table_schema = 'tableowner'
          for row in cur.fetchall():
      
      # Read and print tables
      for row in cur.fetchall():
          print(row[0])
      

      输出:

      my_table_name_1
      my_table_name_2
      my_table_name_3
      ...
      my_table_name_x
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-12
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        • 2020-03-13
        相关资源
        最近更新 更多