使用Python操作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(sqlserver客户端也可以)

直接访问数据库:

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库操作SqlServer连接,基本上就是一把梭。

基本的建立连接:

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()进行数据提交。如果不提交,可以即便语句执行了,也没有结果返回。此外,连接一开始设定了自动提交属性,可以忽略这条。

版权声明:转载文章来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。

相关新闻

历经多年发展,已成为国内好评如潮的Linux云计算运维、SRE、Devops、网络安全、云原生、Go、Python开发专业人才培训机构!