Pythonを使用したMicrosoft SQLサーバーへの接続


97

Microsoft SQLサーバー上のいくつかのSQLデータベースでクエリを実行するために、Pythonを介してSQLに接続しようとしています。私のオンライン調査およびこのフォーラムでの最も有望なライブラリはpyodbcのようです。だから私は次のコードを作りました

import pyodbc
conn = pyodbc.connect(init_string="driver={SQLOLEDB}; server=+ServerName+; 
database=+MSQLDatabase+; trusted_connection=true")
cursor = conn.cursor()

次のエラーが発生します

Traceback (most recent call last):
  File "C:\Users...\scrap.py", line 3, in <module>
    conn = pyodbc.connect(init_string="driver={SQLOLEDB}; server=+ServerName+; database=+MSQLDatabase+; trusted_connection=true")
pyodbc.Error: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')

私は次の投稿を見て、ドライバーを{sql server}に変更してみましたが、以前はODBCリンクを使用してSASで接続していました。これは、上記のコードのベースとなっている部分なので、他に何かをインストールする必要はないと思います。

pyodbc.Error:( 'IM002'、 '[IM002] [unixODBC] [Driver Manager] Data source name not found and no default driver specified(0)(SQLDriverConnect)')

Pyodbc-"データソース名が見つからず、デフォルトのドライバーが指定されていません"

ありがとう

回答:


145

これが私のやり方です...

import pyodbc 
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
                      "Server=server_name;"
                      "Database=db_name;"
                      "Trusted_Connection=yes;")


cursor = cnxn.cursor()
cursor.execute('SELECT * FROM Table')

for row in cursor:
    print('row = %r' % (row,))

関連リソース:


61

以前に述べられたことへのマイナーな追加。データフレームを返したいと思うでしょう。これは次のように行われます

import pypyodbc 
import pandas as pd

cnxn = pypyodbc.connect("Driver={SQL Server Native Client 11.0};"
                        "Server=server_name;"
                        "Database=db_name;"
                        "uid=User;pwd=password")
df = pd.read_sql_query('select * from table', cnxn)

38

クライアントとサーバー間のデータソース接続には、2つの一般的なタイプがあります。ドライバーを使用するODBCと、PROVIDERを使用するOLEDBです。そして、プログラミングの世界では、データソースに接続するためにどのルートを使用するかについて定期的な議論があります。

プロバイダーを使用していますが、SQLOLEDBそれをドライバーとして指定しています。私の知る限り、pyodbcモジュールもpypyodbcモジュールも、ウィンドウOLEDB接続をサポートしていません。ただし、adodbapiは、基本コンポーネントとしてMicrosoft ADOを使用します。

以下は、接続パラメーターの両方のアプローチです。また、連結によって文字列内の引用符が適切に分割されなかったため、変数を文字列形式にします。中かっこが接続文字列で必要でありstring.format()、使用されているため、二重になっていることに気づくでしょう。

# PROVIDER
import adodbapi
conn = adodbapi.connect("PROVIDER=SQLOLEDB;Data Source={0};Database={1}; \
       trusted_connection=yes;UID={2};PWD={3};".format(ServerName,MSQLDatabase,username,password))
cursor = conn.cursor()

# DRIVER
import pyodbc
conn = pyodbc.connect("DRIVER={{SQL Server}};SERVER={0}; database={1}; \
       trusted_connection=yes;UID={2};PWD={3}".format(ServerName,MSQLDatabase,username,password))
cursor = conn.cursor()

説明とコードをありがとう、私はドライバーを動作させました。ただし、.format(...)を削除して、変数を適切な場所に配置する必要がありました。フォーマットは何をするつもりでしたか?
Christopher Ell 2015年

1
adodbapiOLEDB接続を使用するには、インストールする必要があります。また、文字列形式は、+演算子を使用するのではなく、文字列に変数を渡すための推奨される方法です。番号付き中括弧format()は、それに応じて埋められるプレースホルダーです。を使用してリストやタプルを渡すこともできますformat()。元のコードは文字列と変数を引用符で区切らなかったため+、文字列の一部と見なされていました。
2015年

4
この答えは素晴らしいですが、問題を解決するのに役立ちました。それを行おうとしている人は誰でも、trusted connection = yesを設定して同じ接続文字列にUID / pwdを入力すると、例外が発生する可能性があることを覚えておいてください。これはいずれかまたは両方の組み合わせであり、信頼できる接続を使用する場合、UID / PWDを明示的に言及している場合でも、NT /システム資格情報が認証に使用されます。
S4nd33p 2017年

15

私はこの方法を好みます...それははるかに簡単でした

http://www.pymssql.org/en/stable/pymssql_examples.html

conn = pymssql.connect("192.168.10.198", "odoo", "secret", "EFACTURA")
cursor = conn.cursor()
cursor.execute('SELECT * FROM usuario')

3
このプロジェクトは中止されました:github.com/pymssql/pymssql
Pablo EM

だが!2020年8月の時点で、減価償却は行われていません。リポジトリが再びアクティブであることがわかります:github.com/pymssql/pymssql
deweydb


4

pytdsを使用してみてください。pytdsは、より複雑な環境で機能しpyodbc、セットアップがより簡単です。

Ubuntu 18.04で動作させました

参照:https : //github.com/denisenkom/pytds

ドキュメントのコード例:

import pytds
with pytds.connect('server', 'database', 'user', 'password') as conn:
    with conn.cursor() as cur:
        cur.execute("select 1")
        cur.fetchall()

1
ありがとうございました。複雑な設定なしでチャームのように機能します。
Shubham Patel

3

次のPythonコードは私のために働いた。ODBC接続を確認するために、最初に以下に示す4行のC#コンソールアプリケーションを作成しました。

Pythonコード

import pandas as pd
import pyodbc 
cnxn = pyodbc.connect("Driver={SQL Server};Server=serverName;UID=UserName;PWD=Password;Database=RCO_DW;")
df = pd.read_sql_query('select TOP 10 * from dbo.Table WHERE Patient_Key > 1000', cnxn)
df.head()

ストアドプロシージャの呼び出し

 dfProcResult = pd.read_sql_query('exec dbo.usp_GetPatientProfile ?', cnxn, params=['MyParam'] )

ODBC接続をチェックするC#プログラム

    static void Main(string[] args)
    {
        string connectionString = "Driver={SQL Server};Server=serverName;UID=UserName;PWD=Password;Database=RCO_DW;";
        OdbcConnection cn = new OdbcConnection(connectionString);
        cn.Open();
        cn.Close();
    }


0

これは私のために働くものです:

from sqlalchemy import create_engine
import urllib

conn_str = (
r'Driver=ODBC Driver 13 for SQL Server;'
r'Server=DefinitelyNotProd;'
r'Database=PlayPen;'
r'Trusted_Connection=Yes;')

quoted_conn_str = urllib.parse.quote_plus(conn_str)
engine = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted_conn_str))

0

ここで最新のリソースを見つけました: Microsoft | SQLドキュメント| Python SQLドライバー

必要なすべての前提条件とコード例を含めて、これらの2つのオプションについて説明します 。PythonSQLドライバー-pyodbc(テスト済み、動作中) Python SQLドライバー-pymssql


こんにちは-Stack Overflowへようこそ-いくつかのアイデア(この場合は新しいアイデア)-独自のコードの一部または新しいアプローチで質問に対処することを目指してください。次に、いくつかのリンクを使用して、より多くの支援を提供するか、ソリューションをバックアップします。いくつかのリンクを投稿するだけではいけません。
アレックスレオ

0

私のバージョン。それが役に立てば幸い。


import pandas.io.sql
import pyodbc
import sys

server = 'example'
db = 'NORTHWND'
db2 = 'example'

#Crear la conexión
conn = pyodbc.connect('DRIVER={SQL Server};SERVER=' + server +
                      ';DATABASE=' + db +
                      ';DATABASE=' + db2 +
                      ';Trusted_Connection=yes')
#Query db
sql = """SELECT [EmployeeID]
      ,[LastName]
      ,[FirstName]
      ,[Title]
      ,[TitleOfCourtesy]
      ,[BirthDate]
      ,[HireDate]
      ,[Address]
      ,[City]
      ,[Region]
      ,[PostalCode]
      ,[Country]
      ,[HomePhone]
      ,[Extension]
      ,[Photo]
      ,[Notes]
      ,[ReportsTo]
      ,[PhotoPath]
  FROM [NORTHWND].[dbo].[Employees] """
data_frame = pd.read_sql(sql, conn)
data_frame

0

私は次の方法でSQLサーバーに接続しようとしましたが、それらは私にとってはうまくいきました。

Windows認証を使用して接続するには

import pyodbc

conn = pyodbc.connect('Driver={SQL Server};Server='+servername+';Trusted_Connection=yes;Database='+databasename+';')
cursor = conn.cursor()
cursor.execute("Select 1 as Data")

SQLサーバー認証を使用するには、次のコードを使用しました。

import pyodbc

conn = pyodbc.connect('Driver={SQL Server};Server='+servername+  ';UID='+userid+';PWD='+password+';Database='+databasename) 
cursor1 = conn.cursor()
cursor1.execute("SELECT 1 AS DATA")

0

で試してくださいpymssqlpip install pymssql

import pymssql

try:
    conn = pymssql.connect(server="host_or_ip", user="your_username", password="your_password", database="your_db")
    cursor = conn.cursor()
    cursor.execute ("SELECT @@VERSION")
    row = cursor.fetchone()
    print(f"\n\nSERVER VERSION:\n\n{row[0]}")
    cursor.close()
    conn.close()
except Exception:
    print("\nERROR: Unable to connect to the server.")
    exit(-1)

出力:

SERVER VERSION:

Microsoft SQL Server 2016 (SP2-CU14) (KB4564903) - 13.0.5830.85 (X64)
        Jul 31 2020 18:47:07
        Copyright (c) Microsoft Corporation
        Standard Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ) (Hypervisor)

接続はターミナルからも確認できますsqlcmd。コードは1行でで確認できます。構文を参照してください。

╔═════════╦═════════════════════════════════════════╗
 Command                Description               
╠═════════╬═════════════════════════════════════════╣
   -S     [protocol:]server[instance_name][,port] 
   -U     login_id                                
   -p     password                                
   -Q     "cmdline query" (and exit)              
╚═════════╩═════════════════════════════════════════╝
sqlcmd -S "host_or_ip"  -U "your_username" -p -Q "SELECT @@VERSION"

出力:

Password:    your_password



--------------------------------------------------------------------------------------------------------------------------------------------------------
Microsoft SQL Server 2016 (SP2-CU14) (KB4564903) - 13.0.5830.85 (X64) 
        Jul 31 2020 18:47:07 
        Copyright (c) Microsoft Corporation
        Standard Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ) (Hypervisor)


(1 rows affected)

Network packet size (bytes): 4096
1 xact[s]:
Clock Time (ms.): total         1  avg   1.00 (1000.00 xacts per sec.)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.