pyodbc no puede conectarse a la base de datos

Estoy usando la biblioteca pyodbc desde aquí y me estoy conectando de esta manera:

 conn = pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};Server=(localdb)\MSSQLLocalDB;Integrated Security=true; database = online_banking; autocommit = True') 

Uso MSSQLLocalDB porque es el nombre de instancia predeterminado para SQL Server 2014. Y esta última versión de Python 2.7.

Sin embargo, no puedo ejecutar ninguna consulta simple, cada una de ellas genera un error, diciendo que no existe tal objeto o en esa base de datos de caso particular:

 cursor.execute('use online_banking;') 

El error completo:

 pyodbc.Error: ('08004', "[08004] [Microsoft][SQL Server Native Client 11.0][SQL Server]Database 'online_banking' does not exist. Make sure that the name is entered correctly. (911) (SQLExecDirectW)") 

Entonces, ¿qué está mal aquí?

Solo hay 1 instancia instalada y dichas databases(.mdf) introduzca la descripción de la imagen aquí introduzca la descripción de la imagen aquí

Como puedes ver solo 1 motor:

introduzca la descripción de la imagen aquí

Seleccionar ese motor me permitirá ver la base de online_banking introduzca la descripción de la imagen aquí

La base de datos upd1 ha sido creada de esta manera:

 CREATE DATABASE [online_banking] ON PRIMARY ( NAME = N'online_banking', FILENAME = N'C:\...\online_banking.mdf' , SIZE = 512000KB , MAXSIZE = UNLIMITED, FILEGROWTH = 30%) LOG ON ( NAME = N'online_banking_log', FILENAME = N'C:\...\online_banking_log.ldf' , SIZE = 1024KB , MAXSIZE = 20GB , FILEGROWTH = 10%) GO 

upd2 He usado la herramienta sqlcmd . Entonces, este sqlcmd -S (LocalDB)\MSSQLLocalDB -i C:\Users\1.sql -E ha demostrado que MSSQLLocalDB no tiene mi base de datos.

Sin embargo, sqlcmd -S localhost -i C:\Users\1.sql -E realizó correctamente. Estoy totalmente confundido, solo instalé un servidor, además SQL Studio Studio solo ve un servidor local con mi online_banking datos en línea. Esto es muy extraño para mí.

Tratando de usar esta cadena de conexión en Python

 conn = pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};Server=localhost;Integrated Security=true; database = online_banking; autocommit = True') 

provoca el error a continuación:

 pyodbc.Error: ('28000', '[28000] [Microsoft][SQL Server Native Client 11.0][SQL Server]\x... "". (18456) (SQLDriverConnect); [01S00] [Microsoft][SQL Server Native Client 11.0]\xcd\xe5\xe....xe8\xff (0); [28000] [Microsoft][SQL Server Native Client 11.0][SQL Server]\xce...ff "". (18456); [01S00] [Microsoft][SQL Server Native Client 11.0]\xcd\xe.... (0)' 

upd3: el mdf especificado debe adjuntarse, lo consiguió: se probó de varias maneras, siempre con errores (con la base de datos especificada o no en la cadena de conexión):

 conn = pyodbc.connect( r'Driver={SQL Server Native Client 11.0};Server=(localdb)\MSSQLLocalDB; database =online_banking; AttachDbFilename=C:\Program Files\Microsoft SQL Server\MSSQL12.SQLSERVERINSAF\MSSQL\DATA\online_banking.mdf;Trusted_Connection=Yes; Integrated Security=true; database = online_banking;') error: A database with the same name exists, or specified file cannot be opened, or it is located on UNC share. 

Descubrí que puede estar relacionado con el servidor principal que ya ha adjuntado esta db, pero no lo resolví.

upd4 Probé un código simple desde aquí para ver si “online_banking” aparece en la lista de bases de datos para esa instancia. Pero se enfrentó a otro error:

Pyodbc.Error: (‘08001’, ‘[08001] [Microsoft] [SQL Server Native Client 11.0] \ – error ilegible

Además esa base de datos introduzca la descripción de la imagen aquí De acuerdo con SSMS parece que ya se ha adjuntado por el online_banking datos en línea

Resulta que la base de datos en cuestión ya estaba adjunta a la instancia predeterminada de SQL Server en la máquina local, por lo que todo lo que se necesitaba para conectarse era

 import pyodbc conn_str = ( r"Driver={SQL Server Native Client 11.0};" r"Server=(local);" r"Database=online_banking;" r"Trusted_Connection=yes;" ) conn = pyodbc.connect(conn_str) 

Había dos puntos principales de confusión:

P: ¿Cuál es el nombre de una “instancia predeterminada” de SQL Server?

A: No tiene uno.

Cuando se hace referencia a una instancia de SQL Server por su nombre, una instancia predeterminada simplemente va por el nombre de la máquina, mientras que una instancia con nombre se identifica con MachineName\InstanceName . Entonces, en un servidor llamado PANORAMA

  • Si instalamos una “instancia predeterminada” de SQL Server, nos referiremos a ella como PANORAMA .
  • Si instalamos una “instancia con nombre” llamada “SQLEXPRESS”, nos referiremos a ella como PANORAMA\SQLEXPRESS .

Si nos referimos a una instancia de servidor SQL en la máquina local, podemos usar (local) lugar de PANORAMA .

P: ¿(local) y (localdb) significan lo mismo?

A: NO.

(local) y (local)\InstanceName refieren a (local)\InstanceName “reales” basadas en servidor de SQL Server. Estas son las instancias que han existido desde que se lanzó SQL Server por primera vez. Se ejecutan como un servicio y pueden aceptar conexiones de red y hacer todas las cosas que esperamos que haga un servidor de base de datos.

(localdb) y (localdb)\InstanceName (localdb) con (localdb) generalmente en mayúsculas como (LocalDB) para mayor claridad) se utilizan para conectarse a las instancias de “SQL Server LocalDB”. Estas son instancias locales temporales de SQL Server destinadas principalmente a desarrolladores. Para más detalles vea la siguiente publicación del blog de MSDN:

SQL Express v LocalDB v SQL Compact Edition

Posiblemente podría ser un problema de seguridad. Está utilizando la seguridad integrada, por lo que utilizará las credenciales de seguridad del inicio de sesión de Windows que ejecuta el progtwig cliente. Si ese usuario o un grupo al que pertenece el usuario no tiene acceso público a la base de datos, aparecerá como si la base de datos no existiera. Asegúrate de que el usuario o el grupo del que es miembro esté configurado con un inicio de sesión y que tenga acceso público a tu base de datos , o usa la autenticación del servidor SQL y envía un nombre de usuario y contraseña en tu cadena de conexión.