使用sqlalchemy和pyodbc连接到SQL Server 2012

时间:2013-04-01 19:54:00

标签: python sql-server sqlalchemy pyodbc

我正在尝试使用Python 3.3(Windows 7-64位)上的SQLAlchemy(使用pyodbc)连接到SQL Server 2012数据库。我能够使用直接pyodbc进行连接,但是在使用SQLAlchemy进行连接时却没有成功。我有数据库访问的dsn文件设置。

我使用这样的直接pyodbc成功连接:

con = pyodbc.connect('FILEDSN=c:\\users\\me\\mydbserver.dsn')

对于sqlalchemy,我尝试过:

import sqlalchemy as sa
engine = sa.create_engine('mssql+pyodbc://c/users/me/mydbserver.dsn/mydbname')

create_engine方法实际上并未设置连接并且成功,但是 如果我尝试了导致sqlalchemy实际设置连接的内容(如engine.table_names()),则需要一段时间,但会返回此错误:

DBAPIError: (Error) ('08001', '[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied. (17) (SQLDriverConnect)') None None

我不确定哪里出错了如何查看sqlalchemy实际传递给pyodbc的连接字符串。我已成功使用与SQLite和MySQL相同的sqlalchemy类。

提前致谢!

6 个答案:

答案 0 :(得分:29)

SQLAlchemy将基于文件的DSN字符串解释为服务器名称= c,数据库名称= users

我更喜欢在不使用DSN的情况下进行连接,这是在代码迁移期间处理的一项配置任务。

此语法使用Windows身份验证:

engine = sa.create_engine('mssql+pyodbc://server/database')

或使用SQL身份验证:

engine = sa.create_engine('mssql+pyodbc://user:password@server/database')

SQLAlchemy对不同的连接字符串选项here有详尽的解释。

答案 1 :(得分:17)

我有一个关于MSSQL Server连接的更新信息,不使用DSN并使用Windows身份验证。在我的例子中,我有下一个选项: 我的本地服务器名称是"(localdb)\ ProjectsV12"。我从数据库属性中看到的本地服务器名称(我使用的是Windows 10 / Visual Studio 2015)。 我的数据库名称是" MainTest1"

engine = create_engine('mssql+pyodbc://(localdb)\ProjectsV12/MainTest1?driver=SQL+Server+Native+Client+11.0', echo=True)

需要在连接中指定驱动程序。 您可以在以下位置找到您的客户端版本:

  

控制面板>系统和安全>管理工具。> ODBC数据   来源>系统DSN标签>添加

从列表中查看SQL Native客户端版本。

答案 2 :(得分:9)

在Python 3中,您可以使用模块urllib.parse中的函数quote_plus来创建连接参数:

import urllib
params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};"
                                 "SERVER=dagger;"
                                 "DATABASE=test;"
                                 "UID=user;"
                                 "PWD=password")

engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params))

要使用Windows身份验证,您希望使用 Trusted_Connection 作为参数:

params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};"
                                 "SERVER=dagger;"
                                 "DATABASE=test;"
                                 "Trusted_Connection=yes")

在Python 2中,您应该使用库urllib中的函数quote_plus来代替:

params = urllib.quote_plus("DRIVER={SQL Server Native Client 11.0};"
                           "SERVER=dagger;"
                           "DATABASE=test;"
                           "UID=user;"
                           "PWD=password")

答案 3 :(得分:1)

只想在此处添加一些最新信息: 如果您使用DSN连接进行连接:

engine = create_engine("mssql+pyodbc://USERNAME:PASSWORD@SOME_DSN")

如果使用主机名连接进行连接:

engine = create_engine("mssql+pyodbc://USERNAME:PASSWORD@HOST_IP:PORT/DATABASENAME?driver=SQL+Server+Native+Client+11.0")

有关详细信息,请参阅"Official Document"

答案 4 :(得分:0)

我做了不同的工作,像个魅力。

首先导入库:

int i = 0;
void insert(int heap[],int data)
{
    int j = 0;
    if(i == 0)
        {
            heap[i] = data;
        }
        else if(heap[(i-1)/2] < data)
        {
            heap[i] = heap[(i-1)/2];
            i = (i-1)/2;
            insert(heap,data);

        }
}
void display(int heap[],int size)
{
    system("cls");
    for(int i=0,j=1;i<size;i++,j++)
    {
        printf("%d.) %d\n",j,heap[i]);
    }
}

void main()
{
    int heap[5],men,data,c;
    while(1)
    {
        system("cls");

        printf("1.) Insert\n");
        printf("2.) Display\n");
        printf("3.) exit\n");
        printf("Enter your choice : ");
        scanf("%d",&men);
        switch(men)
        {
            case 1 : printf("Enter data : ");
                     scanf("%d",&data);
                     heap[i] = data;
                     insert(heap,data);
                     i++;
                     printf("%d successfully added to heap!",data);
                     break;

            case 2 : display(heap,i);
                    break;

            case 3 : exit(0);
            break;

            default : printf("Invalid choice!");
                      while((c=fgetc(stdin))!='\n'){}
                      break;            
        }
        getch();
    }

}

创建函数以创建引擎

import pandas as pd
from sqlalchemy import create_engine
import pyodbc

使用查询创建变量

def mssql_engine(user = os.getenv('user'), password = os.getenv('password')
                 ,host = os.getenv('SERVER_ADDRESS'),db = os.getenv('DATABASE')):
    engine = create_engine(f'mssql+pyodbc://{user}:{password}@{host}/{db}driver=SQL+Server')
    return engine

执行Pandas命令从MSSQL表创建数据框

query = 'SELECT * FROM [Orders]'

答案 5 :(得分:0)

import pyodbc 
import sqlalchemy as sa
engine = sa.create_engine('mssql+pyodbc://ServerName/DatabaseName?driver=SQL+Server+Native+Client+11.0',echo = True)

这适用于 Windows 身份验证。