Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在Python中,如何构造URL来测试我的SQL Server实例是否正在运行?_Sql Server_Python 3.x_Docker Compose_Pytest_Urllib3 - Fatal编程技术网

Sql server 在Python中,如何构造URL来测试我的SQL Server实例是否正在运行?

Sql server 在Python中,如何构造URL来测试我的SQL Server实例是否正在运行?,sql-server,python-3.x,docker-compose,pytest,urllib3,Sql Server,Python 3.x,Docker Compose,Pytest,Urllib3,我正在使用Python3.8和pytest docker compose插件--。有人知道如何编写一个URL,最终告诉我我的SQL Server是否正在运行吗 我有这个docker-compose.yml文件 version: "3.2" services: sql-server-db: build: ./ container_name: sql-server-db image: microsoft/mssql-server-linux:2017

我正在使用Python3.8和pytest docker compose插件--。有人知道如何编写一个URL,最终告诉我我的SQL Server是否正在运行吗

我有这个docker-compose.yml文件

version: "3.2"
services:

  sql-server-db:
    build: ./
    container_name: sql-server-db
    image: microsoft/mssql-server-linux:2017-latest
    ports:
      - "1433:1433"
    environment:
      SA_PASSWORD: "password"
      ACCEPT_EULA: "Y"
但是我不知道传递给重试对象的URL是什么,以测试服务器是否正在运行。这失败了

import pytest
import requests
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
...

@pytest.fixture(scope="function")
def wait_for_api(function_scoped_container_getter):
    """Wait for sql server to become responsive"""
    request_session = requests.Session()
    retries = Retry(total=5,
                    backoff_factor=0.1,
                    status_forcelist=[500, 502, 503, 504])
    request_session.mount('http://', HTTPAdapter(max_retries=retries))

    service = function_scoped_container_getter.get("sql-server-db").network_info[0]
    api_url = "http://%s:%s/" % (service.hostname, service.host_port)
    assert request_session.get(api_url)
    return request_session, api_url
除此之外

raise ConnectionError(e, request=request)
E           requests.exceptions.ConnectionError: HTTPConnectionPool(host='0.0.0.0', port=1433): Max retries exceeded with url: / (Caused by ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')))

您可以使用类似的方法,如果它已连接,它将输出。下面是一个示例函数,它将重试连接到数据库,并且在成功连接或达到定义的
maxRetries
之前不会返回:

def waitDb(服务器、数据库、用户名、密码、最大尝试次数、WaitBetweenAttestsSeconds):
"""
如果在达到maxAttempts数之前成功建立连接,则返回True
反之,返回False
pyodbc.connect具有内置超时。请使用大于零的WaitBetweenAttestsSeconds在该超时上添加延迟
"""
对于范围内的尝试次数(最大尝试次数):
cnxn=无
尝试:
cnxn=pyodbc.connect('DRIVER={ODBC DRIVER 17 for SQL Server};Server='+Server+';DATABASE='+DATABASE+';UID='+username+';PWD='+password)
cursor=cnxn.cursor()
例外情况除外,如e:
打印(traceback.format_exc())
最后:
如果是cnxn:
打印(“数据库已启动并运行:”)
返回真值
其他:
打印(“尝试编号时数据库尚未运行”+str(尝试编号))
时间。睡眠(在尝试秒之间等待)
打印(“超过等待DB联机的最大尝试次数”)
返回错误
我在这里写了一个简单的例子:


我包括了三个可以独立执行的操作,但您可以跳到最后一步,具体针对您的要求:

1。从python连接到由compose文件启动的mssql:
对于我来说,找到并安装合适的ODBC驱动程序及其依赖项非常烦人-
ODBC驱动程序17 For SQL Server
在Ubuntu 18上最适合我。
要仅执行此步骤,请在我的示例中,
docker编写
the,然后运行

2。创建了一个函数,该函数尝试使用maxAttemptsNumber和重试之间的延迟连接到数据库:
运行这个。您可以使用maxAttempts和delayBetweenAttempts值,然后以随机方式打开数据库进行测试。

3。将所有内容放在测试套件中:

  • 上面描述的功能
  • 与您在示例中提供的相同,以加速compose文件中定义的资源
  • waitDb
    返回之前不会执行的伪码(如果要完全阻止此测试,可以从
    waitDb
    函数中抛出而不是返回False)

PS:继续使用ENVs/vault等,而不是像我为虚拟示例所做的那样存储真实密码。

您是否在上面尝试过,“service.hostname”是localhost,“service.host\u port”是1433。我认为一个问题是HttpAdapter可能不适合测试SQL server连接性,因为我不相信SQL server使用http。Dave是对的。SQL server未响应HTTP请求。如果检查SQL server是否已启动并正在运行就足够了,只需通过TelnetLibSOP在端口1433上创建一个telnet,以检查SQL server实例是否正在运行si,从而检查其Windows服务状态。我不是pythonista,所以我无法告诉您如何在python中做到这一点。连接到数据库不是推荐的方式,因为有许多其他因素可能会阻止特定用户连接到特定数据库,即使实例正在运行。这可能会有帮助:谢谢。我在弄清楚如何获取您所拥有的并将其插入“wait_for_api”装置时遇到了一点困难。“requests.Session()”具有指数级的回退功能,因此它最终会确定服务器何时启动。
if connection.is_connected():
    db_Info = connection.get_server_info()
    print("Connected to MySQL Server version ", db_Info)
    cursor = connection.cursor()
    cursor.execute("select database();")
    record = cursor.fetchone()
    print("You're connected to database: ", record)