J'essaie de me connecter à SQL via python pour exécuter des requêtes sur certaines bases de données SQL sur le serveur Microsoft SQL. D'après mes recherches en ligne et sur ce forum, la bibliothèque la plus prometteuse semble être pyodbc. J'ai donc fait le code suivant
import pyodbc
conn = pyodbc.connect(init_string="driver={SQLOLEDB}; server=+ServerName+;
database=+MSQLDatabase+; trusted_connection=true")
cursor = conn.cursor()
et obtenez l'erreur suivante
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)')
J'ai consulté les publications suivantes et essayé de remplacer mon pilote par {serveur SQL}} et je me suis connecté à l'aide de liens ODBC dans SAS, ce qui est en partie la base de mon code ci-dessus. besoin d'installer quelque chose d'autre.
Pyodbc - "Nom de la source de données introuvable, et aucun pilote par défaut spécifié"
Merci
Voici comment je le fais ...
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,))
Sources pertinentes:
Ajout mineur à ce qui a été dit auparavant. Vous souhaitez probablement renvoyer une image de données. Cela se ferait comme
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)
Dans les connexions à une source de données entre un client et un serveur, il existe deux types généraux: ODBC qui utilise un PILOTE et OLEDB qui utilise un FOURNISSEUR. Et dans le monde de la programmation, il s'agit d'un débat régulier quant à la route à suivre pour la connexion aux sources de données.
Vous utilisez un fournisseur, SQLOLEDB
, mais vous le spécifiez en tant que pilote. Autant que je sache, ni les modules pyodbc ni pypyodbc ne prennent en charge les connexions Windows OLEDB. Toutefois, le adodbapi utilise le Microsoft ADO en tant que composant sous-jacent.
Vous trouverez ci-dessous les deux approches pour vos paramètres de connexion. En outre, je format de chaîne vos variables car votre concaténation n'a pas correctement cassé les guillemets dans la chaîne. Vous remarquerez que je double les accolades puisqu'il est nécessaire dans la chaîne de connexion et que string.format()
l'utilise également.
# 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()
Je préfère cette façon ... c'était beaucoup plus facile
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')
Suivre le code Python a fonctionné pour moi. Pour vérifier la connexion ODBC, j'ai d'abord créé une application console C # à 4 lignes, comme indiqué ci-dessous.
Code 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()
Appel d'une procédure stockée
dfProcResult = pd.read_sql_query('exec dbo.usp_GetPatientProfile ?', cnxn, params=['MyParam'] )
programme C # à vérifier ODBC connexion
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();
}
Essayez d’utiliser des pytd, cela fonctionne dans un environnement plus complexe que pyodbc
et plus facile à installer.
Je l'ai fait fonctionner sur Ubuntu 18.04
import pytds
with pytds.connect('server', 'database', 'user', 'password') as conn:
with conn.cursor() as cur:
cur.execute("select 1")
cur.fetchall()
Une autre approche serait installation Microsoft ODBC Pilote 13, puis remplacez SQLOLEDB
par ODBC Driver 13 for SQL Server
Cordialement.