pyodbc.connect()有效,但不是sqlalchemy.create_engine().connect()

KOB*_*KOB 11 python sql-server sqlalchemy pyodbc pandas

我正在尝试编写一个Python脚本,可以将Excel工作表导入我的SQL Server Express(带有Windows身份验证)数据库作为表.为此,我pandas用来将Excel文件读入a pandas DataFrame,然后希望用来pandas.to_sql()将数据导入我的数据库.但是,要使用此功能,我需要使用sqlalchemy.create_engine().

我可以pyodbc单独使用连接到我的数据库,并运行测试查询.这个连接使用以下代码完成:

def create_connection(server_name, database_name):
    config = dict(server=server_name, database= database_name)

    conn_str = ('SERVER={server};DATABASE={database};TRUSTED_CONNECTION=yes')

    return pyodbc.connect(r'DRIVER={ODBC Driver 13 for SQL Server};' + conn_str.format(**config))

...

server = '<MY_SERVER_NAME>\SQLEXPRESS'
db = '<MY_DATABASE_NAME>

connection = create_connection(server, db)
cursor = connection.cursor()
cursor.execute('CREATE VIEW test_view AS SELECT * FROM existing_table')
cursor.commit()
Run Code Online (Sandbox Code Playgroud)

然而,由于我不能使用这个并没有多大用处pandas.to_sql()- 这样做我需要一个引擎sqlalchemy.create_engine(),但是我很难弄清楚如何在我create_connection()上面的函数中使用我的相同细节来成功创建引擎并连接到数据库.

我尝试了许多很多组合:

engine = create_engine("mssql+pyodbc://@C<MY_SERVER_NAME>\SQLEXPRESS/<MY_DATABASE_NAME>?driver={ODBC Driver 13 for SQL Server}?trusted_connection=yes")
conn = engine.connect().connection
Run Code Online (Sandbox Code Playgroud)

要么

engine = create_engine("mssql+pyodbc://@C<MY_SERVER_NAME>\SQLEXPRESS/<MY_DATABASE_NAME>?trusted_connection=yes")   
conn = engine.connect().connection
Run Code Online (Sandbox Code Playgroud)

Gor*_*son 13

一个通过精确Pyodbc字符串传递对我的作品在Python 3.6在Windows上:

from sqlalchemy import create_engine
import urllib
conn_str = (
    r'Driver=ODBC Driver 11 for SQL Server;'
    r'Server=(local)\SQLEXPRESS;'
    r'Database=myDb;'
    r'Trusted_Connection=yes;'
)
quoted_conn_str = urllib.parse.quote_plus(conn_str)
engine = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted_conn_str))
cnxn = engine.connect()
rows = cnxn.execute("SELECT name FROM sys.tables").fetchall()
print(rows)
Run Code Online (Sandbox Code Playgroud)

  • `URL.create()` 负责处理可能在纯字符串 URL 中导致问题的转义字符。最常见的是密码中的“@”。 (2认同)