【问题标题】:pyodbc.connect() works, but not sqlalchemy.create_engine().connect()pyodbc.connect() 有效,但不是 sqlalchemy.create_engine().connect()
【发布时间】:2017-11-29 07:45:35
【问题描述】:

我正在尝试编写一个 Python 脚本,该脚本可以获取 Excel 表格并将它们作为表格导入我的 SQL Server Express(使用 Windows 身份验证)数据库中。为此,我使用pandas 将Excel 文件读入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()

但是,这并没有多大用处,因为我不能使用 pandas.to_sql() - 为此我需要来自 sqlalchemy.create_engine() 的引擎,但我正在努力弄清楚如何在我的 @987654329 中使用相同的详细信息上面的@函数成功创建引擎并连接数据库。

我尝试了很多很多组合:

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

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

【问题讨论】:

    标签: python sql-server pandas sqlalchemy pyodbc


    【解决方案1】:

    Pass through exact Pyodbc string 为我工作:

    from sqlalchemy import create_engine
    from sqlalchemy.engine import URL
    
    connection_string = (
        r"Driver=ODBC Driver 17 for SQL Server;"
        r"Server=(local)\SQLEXPRESS;"
        r"Database=myDb;"
        r"Trusted_Connection=yes;"
    )
    connection_url = URL.create(
        "mssql+pyodbc", 
        query={"odbc_connect": connection_string}
    )
    engine = create_engine(connection_url)
    cnxn = engine.connect()
    rows = cnxn.execute("SELECT name FROM sys.tables").fetchall()
    print(rows)
    

    【讨论】:

    • 我们为什么要使用quote_plus()?
    • 答案已更新为使用 sqlalchemy.engine.URL
    猜你喜欢
    • 2021-08-23
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多