我正在尝试使用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类。
提前致谢!
答案 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
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 身份验证。