有没有办法使用Windows Domain Credentials在Linux上使用python连接到MS SQL Server数据库?
我可以使用Windows凭据从我的Windows机器上完美地连接,但尝试使用pyodbs + freetds + unixodbc从linux python中做同样的事情
>>import pyodbc
>>conn = pyodbc.connect("DRIVER={FreeTDS};SERVER=servername;UID=username;PWD=password;DATABASE=dbname")
Run Code Online (Sandbox Code Playgroud)
导致此错误:
class 'pyodbc.Error'>: ('28000', '[28000] [unixODBC][FreeTDS][SQL Server]Login incorrect. (20014) (SQLDriverConnectW)')
Run Code Online (Sandbox Code Playgroud)
我确定密码写得正确,但我尝试了很多不同的用户名组合:
DOMAIN\username
DOMAIN\\username
Run Code Online (Sandbox Code Playgroud)
甚至
UID=username;DOMAIN=domain
Run Code Online (Sandbox Code Playgroud)
无济于事.有任何想法吗?
一年多以前,有人问过这个问题:执行.sql文件,用于在python中的SQL Management Studio中运行.
我正在python中编写一个连接到SQL服务器的脚本,并根据大(几GB).sql文件中的SQL命令创建和填充数据库.
看起来SQLCMD需要下载并安装SQL Server Express.有没有其他方法从python执行.sql文件,而不需要使用我的脚本的每个人下载和安装SQL Server?pyodbc有这种能力吗?
编辑:
这是另一个类似的问题: 使用python MySQLdb执行*.sql文件
在这里,解决方案是从命令(在本例中为mysql.exe)调用实用程序,并将该文件作为参数列出.
在我看来应该有一种方法来使用Python的DB API库之一,但我还没有找到它所以我正在寻找像我可以用来运行文件的SQLCMD或MYSQL这样的*.exe从命令行.
PS如果我没有正确地看这个,请随时纠正我.也许下面的代码与从命令行运行一样有效:
for line in open('query.sql','r'):
cursor.execute(line)
Run Code Online (Sandbox Code Playgroud) 我试图连接到SQL server 2000安装在Windows server 2003从Windows Server 2008 R2使用Python 3.4和pyodbc模块.这些服务器位于不同的AD域中.Windows only在SQL Server上启用了身份验证,我无法更改它.
drv = '{SQL server}'
svr = 'sql.my-domain.local'
usr = 'my-domain.local\testuser'
pwd = 'password'
db = 'testdb'
pyodbc.connect(driver=drv, server=svr, user=usr, password=pwd, database=db)
Run Code Online (Sandbox Code Playgroud)
上面的连接失败,出现以下错误:
pyodbc.Error: ('28000', "[28000] [Microsoft][ODBC SQL Server Driver][SQLServer]
Login failed for user 'svx-iroot.local\\sqlexecutive'.
Reason: Not associated with a trusted SQL Server connection. (18452) (SQLDriverConnect)")
Run Code Online (Sandbox Code Playgroud)
有一些问题,例如这一个,建议在连接中添加trusted_connection='yes'参数以pyodbc支持Windows身份验证,但在这种情况下它没有用,因为使用此选项使用本地凭据并且我需要明确提供凭据,因为发起工作站位于不同的AD域.
使用驱动程序创建User DSNin 失败,并出现上述相同的错误. …
我来自 R,但由于各种原因需要在 Python 中执行此操作。这很可能是我的 Python 的基本 PEBKAC 问题,而不是 Pandas、PyODBC 或其他任何东西。
请多多包涵。
我当前的 Python 3 代码:
import pandas as pd
import pyodbc
cnxn = pyodbc.connect(DSN="databasename", uid = "username", pwd = "password")
querystring = 'select order_number, creation_date from table_name where order_number = ?'
orders = ['1234',
'2345',
'3456',
'5678']
for i in orders:
print(pd.read_sql(querystring, cnxn, params = [i]))
Run Code Online (Sandbox Code Playgroud)
我需要的是一个列名为“order_number”和“creation_date”的数据框。
抱歉截屏,无法在此处获取格式。
阅读dataframe.append page 后,我尝试了这个:
df = pd.DataFrame()
for i in orders:
df.append(pd.read_sql(querystring, cnxn, params = [i]))
Run Code Online (Sandbox Code Playgroud)
这似乎运行良好(无论如何都没有抛出错误)。
但是当我尝试输出 df 时,我得到 …
我正在使用一个Linux consumption计划.
我收到以下错误;
Exception: ModuleNotFoundError: No module named 'pyodbc'
我已经pyodbc在requirements.txt文件中添加了这个文件中的其他模块,比如azure-storage工作正常.
有没有人看过这个问题或者可以证实这是一个已知的bug?我看不到任何手动安装它的方法.
我有一个字符串变量 res,它是从 pyodbc 游标派生的,如底部所示。该表test有一行数据,ä其 unicode 代码点为u'\xe4'。
我得到的结果是
>>> res,type(res)
('\xe4', <type 'str'>)
Run Code Online (Sandbox Code Playgroud)
而我应该得到的结果是。
>>> res,type(res)
(u'\xe4', <type 'unicode'>)
Run Code Online (Sandbox Code Playgroud)
我尝试将字符集作为 utf-8 添加到我的 pyodbc 连接字符串中,如下所示。结果现在已正确设置为 unicode,但代码点用于其他字符串?,这可能是由于 pyodbc 驱动程序中可能存在的错误。
conn = pyodbc.connect(DSN='datbase;charset=utf8',ansi=True,autocommit=True)
>>> res,type(res)
(u'\ua4c3', <type 'unicode'>)
Run Code Online (Sandbox Code Playgroud)
实际代码
import pyodbc
pyodbc.pooling=False
conn = pyodbc.connect(DSN='datbase',ansi=True,autocommit=True)
cursor = conn.cursor()
cur = cursor.execute('SELECT col1 from test')
res = cur.fetchall()[0][0]
print(res)
Run Code Online (Sandbox Code Playgroud)
其他详细信息 数据库:Teradata pyodbc 版本:2.7
那么我现在如何
1)投射('\xe4', <type 'str'>)到(u'\xe4', <type 'unicode'>)(是否可以在没有无意副作用的情况下做到这一点?)
2) 解决 pyodbc/unixodbc 问题
在 中python,我有一个从一个数据库 ( Redshiftvia psycopg2) 中选择数据的过程,然后将该数据插入SQL Server(via pyodbc)。我选择进行读/写而不是读/平面文件/加载,因为每天的行数约为 100,000。似乎更容易简单地连接和插入。但是 - 插入过程很慢,需要几分钟。
有没有更好的方法使用 Pyodbc 将数据插入 SQL Server?
select_cursor.execute(output_query)
done = False
rowcount = 0
while not done:
rows = select_cursor.fetchmany(10000)
insert_list = []
if rows == []:
done = True
break
for row in rows:
rowcount += 1
insert_params = (
row[0],
row[1],
row[2]
)
insert_list.append(insert_params)
insert_cnxn = pyodbc.connect('''Connection Information''')
insert_cursor = insert_cnxn.cursor()
insert_cursor.executemany("""
INSERT INTO Destination (AccountNumber, OrderDate, Value)
VALUES (?, ?, ?) …Run Code Online (Sandbox Code Playgroud) 我正在尝试从 SQL 读取一个小表,并且正在考虑从 pyodbc 切换到 SQLAlchemy 以便能够使用 pd.to_sql()
当我比较两者时,sql alchemy 慢得多。
s_py = """\
import pandas as pd
import pyodbc
cxn = pyodbc.connect('DRIVER={SQL SERVER};SERVER=.\;DATABASE=PPIS;UID=sa;PWD=pwd')
"""
s_alch = """\
import pandas as pd
import sqlalchemy
cxn = sqlalchemy.create_engine("mssql+pyodbc://sa:pwd@./PPIS?driver=SQL+Server")
"""
timeit.timeit('pd.read_sql("SELECT * FROM Operators", cxn)',setup=s_py, number=100)
Run Code Online (Sandbox Code Playgroud)
输出[21]:0.18496091418973037
timeit.timeit('pd.read_sql("SELECT * FROM Operators", cxn)',setup=s_alch, number=100)
Run Code Online (Sandbox Code Playgroud)
输出[23]:4.407356934717654
我见过这个谈论插入行。但为什么读取速度会慢很多呢?
要使用 MFA(在 SSMS 中作为“Active Directory - Universal”)连接到 Azure SQL 数据库,Microsoft 建议并且目前只有使用 Microsoft.IdentityModel.Clients.ActiveDirectory 与 C# 连接的教程
Authentication='Active Directory Interactive';从 Python 或 Powershell设置常规 ODBC 连接字符串会导致错误
Cannot find an authentication provider for 'ActiveDirectoryInteractive'
Run Code Online (Sandbox Code Playgroud)
这似乎是因为根据https://docs.microsoft.com/en-us/azure/sql-database/active-directory-interactive-connect-azure-sql-db 上的Microsoft 示例代码,您需要明确创建自己的创建连接时的身份验证提供程序类:
public static void Main(string[] args)
{
var provider = new ActiveDirectoryAuthProvider();
SC.SqlAuthenticationProvider.SetProvider(
SC.SqlAuthenticationMethod.ActiveDirectoryInteractive,
//SC.SqlAuthenticationMethod.ActiveDirectoryIntegrated, // Alternatives.
//SC.SqlAuthenticationMethod.ActiveDirectoryPassword,
provider);
Program.Connection();
}
Run Code Online (Sandbox Code Playgroud)
我想与pyodbc 连接,所以我无法实现ActiveDirectoryInteractive 提供程序。
有什么方法可以使用 OAuth 获取令牌并在连接字符串中使用它,或者在不使用 .NET 的情况下以其他方式实现 ActiveDirectoryInteractive 提供程序?
odbc azure pyodbc azure-sql-database multi-factor-authentication
def insert(self):
conn = pyodbc.connect(
'Driver={SQL Server};'
'Server=DESKTOP-S0VG212\SQLEXPRESS;'
'Database=MovieGuide;'
'Trusted_Connection=yes;'
)
cursor = conn.cursor()
Run Code Online (Sandbox Code Playgroud)
执行查询时发生错误,但我不知道是什么原因造成的。
cursor.execute('insert into Movies(MovieName,Genre,Rating,Username) values(?,?,?,?);',
(self.moviename, self.moviegenre, self.ratebox, self.username))
conn.commit()
Run Code Online (Sandbox Code Playgroud) pyodbc ×10
python ×9
sql-server ×5
odbc ×3
freetds ×2
pandas ×2
azure ×1
dataframe ×1
multi-factor-authentication ×1
sql ×1
sqlalchemy ×1
unicode ×1
unixodbc ×1
utf-8 ×1