用python操作SQL Server

平時都不想觸碰SQL Server這套東西,最終因爲項目原因,有機會用python和SQL Server做了一番聯動。

先說一下SQL Server

如果有條件可以使用遠程連接或者TeamViewer等工具,操作帶GUI的數據庫管理器,實施起來可以很省心。可以直接查看結果,模板化查詢甚至提示語句錯誤等。
如果是使用linux本地或者ssh訪問SQL Server數據庫的,稍微麻煩點。可以使用sqlcmd作爲替代工具。後面會介紹。
沒有mysql一樣的show database;命令,所以顯示所有的數據庫都比較麻煩。可以使用這條命令:select name from sysobjects where xtype='u'

SQL Server中各個系統表的作用

sysaltfiles 僅在主數據庫 保存數據庫的文件
syscharsets 僅在主數據庫 字符集與排序順序
sysconfigures 僅在主數據庫 配置選項
syscurconfigs 僅在主數據庫 當前配置選項
sysdatabases 僅在主數據庫 服務器中的數據庫
syslanguages 僅在主數據庫 語言
syslogins 僅在主數據庫 登陸帳號信息
sysoledbusers 僅在主數據庫 鏈接服務器登陸信息
sysprocesses 僅在主數據庫 進程
sysremotelogins 僅在主數據庫 遠程登錄帳號
syscolumns 每個數據庫 列
sysconstrains 每個數據庫 限制
sysfilegroups 每個數據庫 文件組
sysfiles 每個數據庫 文件
sysforeignkeys 每個數據庫 外部關鍵字
sysindexs 每個數據庫 索引
sysmenbers 每個數據庫 角色成員
sysobjects 每個數據庫 所有數據庫對象
syspermissions 每個數據庫 權限
systypes 每個數據庫 用戶定義數據類型

sql cmd

直接訪問數據庫:

sqlcmd -S SERVERNAME -U USERNAME -P PASSWORD -d DB

示例sqlcmd -S "127.0.0.1" -U "sa" -P "12345678"

遇到查詢操作時提示“對象名無效”的情況:

可能因爲沒有選擇數據庫,或者數據庫裏沒有該表。一定要跟上參數-d。

進入執行模式之後可以輸入自己的SQL語句。可以連續多條,命令最後以GO語句結尾,是SQL Server的語法。

若要提高性能,請在一個 sqlcmd 會話中執行儘可能多的操作,而不是在一系列會話中來執行這些操作。

輸入/輸出選項-f codepage | i:codepage[,o:codepage] | o:codepage[,i:codepage],用於指定輸入和輸出代碼頁。 代碼頁頁碼是指定已安裝的 Windows 代碼頁的數值。

代碼頁轉換規則:

如果未指定代碼頁, sqlcmd 會將當前代碼頁同時用於輸入文件和輸出文件,除非輸入文件爲 Unicode 文件,在此情況下無需進行轉換。

sqlcmd 自動識別 Big-endian Unicode 和 Little-endian Unicode 輸入文件。 如果已指定 -u 選項,輸出將始終爲 Little-endian Unicode。

如果未指定輸出文件,輸出代碼頁將爲控制檯代碼頁。 藉助此方法,可以在控制檯上正確顯示輸出。

假定多個輸入文件具有相同的代碼頁。 可以將 Unicode 和非 Unicode 輸入文件混合在一起。

在命令提示符處輸入 chcp 以驗證 Cmd.exe 的代碼頁。

-i input_file[,輸入_file2...]

標識包含一批 SQL 語句或存儲過程的文件。 可以指定要按順序讀取和處理的多個文件。 文件名之間不要使用任何空格。 sqlcmd 將首先檢查所有指定的文件是否都存在。 如果有一個或多個文件不存在, sqlcmd 將退出。 -i 和 -Q/-q 選項是互斥的。

-i C:\<filename>  
-i \\<Server>\<Share$>\<filename>  
-i "C:\Some Folder\<file name>"  

清空表

刪除表

delete from 表名

清除表中的所有數據、保留表結構( 清除表中所有行,保留表結構、與delete類似):

truncate table 表名

比delete速度快,效率高,使用的系統和事務日誌資源少。

刪除表(所有數據及表結構)

drop table 表名

pymssql

如果使用pymssql操作,基本上就是一把梭。

基本的建立連接

HOST = '127.0.0.1'
USER = 'USERNAME'
PW = 'PASSWORD'
DB = 'DBNAME'
conn = pymssql.connect(host=HOST, user=USER, password=PW, database=DB)
cursor = conn.cursor()

執行SQL語句(查詢):

cursor.execute('SELECT * FROM mytable')
row = cursor.fetchone()
while row:
	row = cursor.fetchone()
conn.close()

在操作執行SQL語句的函數.execute()的時候,傳入語句不能臨時進行拼接,必須是常量或者格式化的變量。可能是考慮注入等問題,故意設定的。

執行SQL語句(其他):

cursor.execute("INSERT INTO position VALUES (%s, %s)", (num, address))
conn.commit()

除了查詢語句比較特殊,其他的語句一般都需要額外的使用.commit()進行數據提交。如果不提交,可以即便語句執行了,也沒有結果返回。此外,連接一開始設定了自動提交屬性,可以忽略這條。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章