簡體   English   中英

Python 執行 sql 文件錯誤 pyodbc 'HY090', '[HY090] [Microsoft][ODBC Driver Manager] Invalid string or buffer length (0) (SQLExecDirectW)'

[英]Python execute sql file error pyodbc 'HY090', '[HY090] [Microsoft][ODBC Driver Manager] Invalid string or buffer length (0) (SQLExecDirectW)'

    import sql_connect  

    def main():
        # check if db exists on target, if not create
        qry_create_db = "if not exists(select * from sys.databases where name = '{}') create database {};".format('mydb','mydb')
        with sql_connect.conn:
            cur1 = sql_connect.cursor.execute(qry_create_db)
            cur1.commit() 

    main()

    def creation_table(filename):    
        # Open and read the file as a single buffer
        fd = open(filename, 'r')
        sqlFile = fd.read()
        fd.close()

        # all SQL commands (split on ';')
        sqlCommands = sqlFile.split(';')

        # Execute every command from the input file
        for command in sqlCommands:
            with sql_connect.conn:
                cur2 = sql_connect.cursor.execute(command)
                cur2.commit()

    creation_table('Mypath\\schema\\TABLES\\TOSHBA.sql')
    creation_table('Mypath\\schema\\TABLES\\TALM_TYPE.sql')

這是我的 python 代碼,它創建了我的數據庫和我的表。 問題是當我執行我的功能時


"creation_table('Mypath\\schema\\TABLES\\TALM_TYPE.sql')" 

我收到此錯誤:

pyodbc.Error: ('HY090', '[HY090] [Microsoft][ODBC Driver Manager] 無效的字符串或緩沖區長度 (0) (SQLExecDirectW)')

這是我的第一個 sql 文件腳本 TOSHBA,我首先使用我的函數 creation_table 執行它並且我沒有錯誤:

    USE mydb;

    DROP TABLE IF EXISTS TOSHBA;

    CREATE TABLE TOSHBA
    (
    TOSHBA_WORK_ID INT NOT NULL IDENTITY,
    WORK_NAME NVARCHAR(200) NOT NULL,
    CONSTRAINT PK_TOSHBA PRIMARY KEY  (TOSHBA_WORK_ID)
    );

這里是我遇到錯誤的第二個 sql 腳本文件:


    USE mydb;

    DROP TABLE IF EXISTS TALM_TYPE;

    CREATE TABLE TALM_TYPE
    (
    TALM_ID INT NOT NULL IDENTITY,
    TOSHBA_id INT NOT NULL,
    TALM_NAME NVARCHAR(20) NOT NULL,
    CONSTRAINT PK_TALM PRIMARY KEY (TALM_ID),
    CONSTRAINT FKֹ_TOSHBA_id FOREIGN KEY (TOSHBA_id) REFERENCES TOSHBA (TOSHBA_WORK_ID)
    );

請幫助我理解錯誤並找到解決方案。

Python 版本:3.7.3 Pyodbc 版本:4.0.27

似乎刪除了最后一個';' 從 sql 文件中解決了這個問題。

我對此不是 100% 的,但是當我遇到同樣的問題並來到這里時,我嘗試刪除最后一個 ';' 從 sql 腳本,它工作。 所以看起來最后一個';'上的.split() 導致一個空行作為循環中的語句運行,無論那里是否有另一行。 因為空行不是有效的 sql 語句。

理論上,要務實地解決這個問題,您可以計算 ; 並且只運行多次拆分,或刪除最后一次; 在加載語句之前從腳本中獲取。 但是當你可以刪除最后一個';'時,這兩個都會超載在你的 sql 文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM