Connecting to Azure SQL Server via Jupyter (issues!) - python

I'm trying to connect to an Azure SQL Server instance from a laptop with Jupyter installed. Fairly new at this but having issues which are probably simple to resolve.
I've installed 64bit Python 3.7, Jupyter and AMD64 v17 pyodbc via pip. However when I'm trying to connect via Jupyter I just get either connection or driver issues, not quite sure.
Below is the code I'm trying to run to connect and return a simple top 10 rows query.
import pyodbc
server = 'xxxsqlserver.database.windows.net'
database = 'xxx.dbo.table'
username = 'user'
password = 'password'
driver='{ODBC Driver 17 for SQL Server}'
cnxn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor()
cursor.execute("SELECT TOP 10 * FROM xxx.dbo.table")
row = cursor.fetchone()
while row:
print (str(row[0]) + " " + str(row[1]))
row = cursor.fetchone()
Below is the error message I get:
InterfaceError Traceback (most recent call
last) in
5 password = 'password'
6 driver='{ODBC Driver 17 for SQL Server}'
----> 7 cnxn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+
password)
8 cursor = cnxn.cursor()
9 cursor.execute("SELECT TOP 10 * FROM xxx.dbo.table")
InterfaceError: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager]
Data source name not found and no default driver specified (0)
(SQLDriverConnect)')
If I change the driver to 13 I get a different error
InterfaceError: ('28000', '[28000] [Microsoft][ODBC Driver 13 for SQL
Server][SQL Server]Login failed for user \'user\'. (18456)
(SQLDriverConnect); [28000] [Microsoft][ODBC Driver 13 for SQL
Server][SQL Server]Cannot open database "xxx.dbo.table" requested by
the login. The login failed. (4060); [28000] [Microsoft][ODBC Driver
13 for SQL Server]Invalid connection string attribute (0); [28000]
[Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Login failed for
user \'user\'. (18456); [28000] [Microsoft][ODBC Driver 13 for SQL
Server][SQL Server]Cannot open database "xxx.dbo.table" requested by
the login. The login failed. (4060); [28000] [Microsoft][ODBC Driver
13 for SQL Server]Invalid connection string attribute (0)')
Feels like the driver isn't doing something quite right or I've got a misalignment somewhere. Note I didn't install any version 13 drivers but do have SSMS installed which put some in, and this connects to the Azure platform just fine.
Any ideas?
Thanks.

Hi there from the looks of things, this may be because your ODBC drivers are not installed properly. It is mostly likely because your are not formatting the string properly. So, here is a comprehensive list of what you need to do:
Install the correct ODBC drivers to connect with SQLServer
This depends on your operating system of course, if you have MacOS, you can go ahead and install it using homebrew like so:
brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
brew update
brew install msodbcsql17 mssql-tools
If you do not know what homebrew is, please take a look at the homebrew official website. If this is not your operating system, then take a look at OS specific instructions in this guide.
Once you have done this, make sure to follow the instructions at the end of the installation, where they tell you what changes you need to make to your dotfiles in order to get ODBC working properly.
Make sure to get the connection string properly. The connection string is located in the "Connection Strings" section of your SQLServer database, and under ODBC:
Once you have the connection string, use fstrings or the .format() function on a string to replace the section of the string that says Pwd={your_password_here}
This should do the trick. However, if it does not then you need to check whether you have the correct username, password and table. If you are sure that they are correct, then you might want to contact Support, since they might have changed the requirements for drivers to be a specific version for your database.

I've also encountered the same error while connecting to Azure SQL database.
The error disappeared once the driver name was changed from DRIVER={ODBC Driver 17 for SQL Server} to DRIVER={SQL Server}, for example:
import pyodbc
server = '<sql-server-name>.database.windows.net'
database = '<database>'
username = '<username>'
password = '<password>'
driver='{SQL Server}'
cnxn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor()
cursor.execute("SELECT TOP 10 * FROM dbo.allOrders")
row = cursor.fetchone()
while row:
print (str(row[0]) + " " + str(row[1]))
row = cursor.fetchone()

Related

Cannot login to SQL database using pyodbc, login failure

Has anyone seen this error before?:
ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot open database "TC" requested by the login. The login failed. (4060) (SQLDriverConnect); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot open database "TC" requested by the login. The login failed. (4060)')
I have verified my credentials and they are 100% correct. As well as, I am using:
python 3.9.7
pyodbc 4.0.0
and when I use:
[x for x in pyodbc.drivers() if x.startswith("ODBC Driver")]
I get:
['ODBC Driver 11 for SQL Server', 'ODBC Driver 17 for SQL Server']
and I'm using SSMS 2014 so ODBC Driver 11 should support that. I am lost as to why this error keeps popping up for my connection string, my connection string is:
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=' + server + ';DATABASE=' + database + ';UID=' + username + ';PWD=' + password)
So I've verified everything I can think of to this point and it all seems correct, what could the issue be?
Try changing the driver to explicitly use v11
pyodbc.connect(driver='{SQL Server Native Client 11.0}',
server='Server', database='TC', uid='id',pwd='pass')

Error: ('CE267', '[CE267] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Error 12029 opening URL

Trying to connect Azure SQL server database which I am able to connect from my local machine through SSMS , getting below error while trying to connect using PYODBC
cnxn = pyodbc.connect('DRIVER='+driver+';PORT=1433;SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password+';Authentication='+ auth)
cursor = cnxn.cursor()
Error: ('CE267', '[CE267] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Error 12029 opening URL
As noted by #AlwaysLearning, Driver 18 has breaking changes, one of which is reversing the default encryption setting from "no" to "yes".
You might try adding to your conn. string: "Encrypt=no;"
This worked for me.

unable to connect MSSQL using pyodbc

I have already looked up a lot of some what similar questions on StackOverflow regarding the connectivity of MSSQL with pyodbc, but none of their solutions helped.
I'm tring to connect a MSSQL database which is lying on a VM server, and I'm trying to access it from my local system. Following is the code:
import pyodbc
server = '172.xxx.xxx.xxx,1443'
database = 'sample_db'
username = 'SA'
password = 'xxxxx'
cnxn = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+password+';Trusted_Connection=yes')
cursor = cnxn.cursor()
cursor.execute("SELECT name FROM sys.databases;")
results = cursor.fetchall()
print(results)
The error I'm getting is as follows:
pyodbc.InterfaceError: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')
If there's any other alternative to pyodbc that works better with MSSQL, please do mention that too.
Any help is appreciated, thanks.
Edit:
Upon #GordThompson suggestion I checked the driver in pyodbc.drivers() and found that my system only has 'SQL Server' driver so I changed the Driver to SQL Server. The present code looks like this:
import pyodbc
server = '172.xxx.xxx.xxx,1443'
database = 'sample_db'
username = 'SA'
password = 'xxxxx'
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+password+';Trusted_Connection=yes')
cursor = cnxn.cursor()
cursor.execute("SELECT name FROM sys.databases;")
results = cursor.fetchall()
print(results)
But now i'm getting a totally different error, still not sure what it is
Error:
pyodbc.OperationalError: ('08001', '[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied. (17) (SQLDriverConnect); [08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (Connect()). (53)')
Its important to not mention the Trusted_Connection parameter when logging-in using UID and PWD. Hence, when I removed the Trusted_Connection parameter, it was able to establish the connection successfully.
So the connection string that later worked for me just had these,
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+password)
cursor = cnxn.cursor()
[ Since #GordThompson didn't post it as an answer, I'm positing it here and closing it. Thanks #GordThompson ]

('IM004', "[IM004] [Microsoft][ODBC Driver Manager] Driver's SQLAllocHandle on SQL_HANDLE_ENV failed (0) (SQLDriverConnect)") error

Searched around, but all the other replies seem to be about Oracle, so I decided to create a new post.
I'm currently trying to connect Python to my SQL Server database using the code provided by Microsoft and the pyodbc library. Code as follows.
import pyodbc
server = 'server.database.windows.net'
database = 'testing'
username = 'user'
password = 'password'
cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL
Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+
password)
cursor = cnxn.cursor()
This error message comes out.
Exception has occurred: Error
('IM004', "[IM004] [Microsoft][ODBC Driver Manager] Driver's SQLAllocHandle
on SQL_HANDLE_ENV failed (0) (SQLDriverConnect)")
What should I change?
I had the same issue on Windows after upgrading an 'old' SQL Server 2017 client to the last one.
Repairing 'Microsoft ODBC Driver 17 for SQL Server' fixed the problem for me.

Connecting to ODBC using pyODBC

I've read all the faq pages from the python odbc library as well as other examples and managed to connect to the DSN, using the following code:
cnxn = pyodbc.connect("DSN=DSNNAME")
cursor = cnxn.cursor()
cursor.tables()
rows = cursor.fetchall()
for row in rows:
print row.table_name
but for everything else I keep getting this error:
Error: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')
I know that I can pull up my data using Microsoft Access by going through the following steps: Creating a new database, clicking the external data tab, Click More and select ODBC database, use the Link to the data source by creating a linked table, in the Select data source window choosing Machine Data source and select NAME2 which has a System type, press okay and choose the table acr.Table_one_hh, then select the fields in the table that I want to look at like City, State, Country, Region, etc. When I hover over the table name it shows the DSN name, Description, Trusted Connection = Yes, APP, Database name and the table name.
I've attempted two methods, first
cnxn = pyodbc.connect('DRIVER={SQL Server Native Client 10.0};SERVER=mycomputername;DATABASE=mydatabase;Trusted_Connection=yes;')
cursor = cnxn.cursor()
which gives an error:
Error: ('08001', '[08001] [Microsoft][SQL Server Native Client 10.0]Named Pipes Provider: Could not open a connection to SQL Server [2]. (2) (SQLDriverConnect); [HYT00] [Microsoft][SQL Server Native Client 10.0]Login timeout expired (0); [08001] [Microsoft][SQL Server Native Client 10.0]A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online. (2)')
I tried
cnxn = pyodbc.connect("DSN=DSNNAME, DATABASE=mydatabase")
cursor = cnxn.cursor()
cursor.execute("""SELECT 1 AS "test column1" from acr.Table_one_hh""")
cursor.tables()
rows = cursor.fetchall()
for row in rows:
print row.table_name
which gave an error
Error: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')
I managed to solve my issue. My code did not really change.
cnxn = pyodbc.connect("DSN=BCTHEAT")
cursor = cnxn.cursor()
cursor.execute("select * from acr.Table_one_hh")
row = cursor.fetchall()
then I wrote the results into a csv file.

Categories