Source code for pyensae.sql.database_function
"""
generic class to access a SQL database
:githublink:`%|py|6`
"""
import os
from pyquickhelper.loghelper.flog import run_cmd
[docs]def get_list_server():
"""
:return: a list of the available servers from this machine
:githublink:`%|py|16`
"""
cmd = "sqlcmd -Lc"
out, err = run_cmd(cmd, wait=True, shell=True, log_error=False)
line = out.split("\n")
line = [_.strip("\r\n ") for _ in line]
line = [_ for _ in line if len(_) > 0]
# we place all server containing the machine name in the first place
machine = os.environ.get(
"COMPUTERNAME", os.environ.get("HOSTNAME", "--------"))
line = sorted([(-1 if _.startswith(machine) else 0, _) for _ in line])
line = [_[1] for _ in line]
return line
[docs]def get_list_instance(server):
"""
:param server: server name
:return: a list of the available instance on a server
:githublink:`%|py|35`
"""
cmd = 'sqlcmd -S %s -Q "SELECT @@ServerName"' % server
out, err = run_cmd(cmd, wait=True, shell=True, log_error=False)
if len(err) > 0:
cmd = 'sqlcmd -S %s\\SQLEXPRESS -Q "SELECT @@ServerName"' % server
out, err = run_cmd(cmd, wait=True, shell=True, log_error=False)
if len(err) > 0:
raise Exception(
"unable to find instances for server %s (%s)" %
(server, err))
li = [_.strip("\r\n ") for _ in out.split("\n")]
li = [_ for _ in li if len(_) > 0]
li = li[1:-1]
return li
[docs]def get_list_database(instance):
"""
:param instance: instance name
:return: a list of the available database
:githublink:`%|py|56`
"""
cmd = 'sqlcmd -S %s -Q "SELECT name FROM master..sysdatabases"' % instance
out, err = run_cmd(cmd, wait=True, shell=True, log_error=False)
li = [_.strip("\r\n ") for _ in out.split("\n")]
no = ["master", "tempdb", "model", "msdb"]
li = [_ for _ in li if len(_) > 0 and _ not in no]
li = li[2:-1]
return li
[docs]def create_database(instance, database, exc=True):
"""
create a database
:param instance: instance name
:param database: database name
:param exc: if True and if the database exists, raise an Exception
Example::
fLOG (OutputPrint = True)
fLOG (get_list_database ('PCXAVIER\\SQLEXPRESS'))
create_database ('PCXAVIER\\SQLEXPRESS', "essai_database")
drop_database ('PCXAVIER\\SQLEXPRESS', "essai_database")
:githublink:`%|py|80`
"""
ins = get_list_database(instance)
if database in ins:
if exc:
raise Exception("database %s already exists" % database)
else:
cmd = 'sqlcmd -S %s -Q "CREATE DATABASE %s"' % (instance, database)
out, err = run_cmd(cmd, wait=True, shell=True, log_error=False)
if len(err) > 0:
raise Exception("error: %s" % err)
[docs]def drop_database(instance, database, exc=True):
"""
remove a database
:param instance: instance name
:param database: database name
:param exc: if True and if the database does not exist, raise an Exception
:githublink:`%|py|98`
"""
ins = get_list_database(instance)
if database not in ins:
if exc:
raise Exception("database %s does not exist" % database)
else:
cmd = 'sqlcmd -S %s -Q "DROP DATABASE %s"' % (instance, database)
out, err = run_cmd(cmd, wait=True, shell=True, log_error=False)
if len(err) > 0:
raise Exception("error: %s" % err)