Python and SQL Server
Python and SQL Server
blog
Python
and SQL Server
Hans-Petter Halvorsen
Free Textbook with lots of Practical Examples
https://www.halvorsen.blog/documents/programming/python/
Additional Python Resources
https://www.halvorsen.blog/documents/programming/python/
Contents
• Database Systems
• SQL Server
• SQL Server and Python
• CRUD Python Examples
• Datalogging Example
What is a Database?
• A Database is a structured way to store lots of information.
• The information inside the database is stored in different
tables.
• - “Everything” today is stored in databases!
Examples:
• Bank/Account systems
• Information in Web pages such as Facebook, Wikipedia,
YouTube, etc.
• … lots of other examples!
Database Systems
We communicate with the Database using a Database Management
System (DBMS). We use the Structured Query Language (SQL) in
order to communicate with the Database, i.e., Insert Data, Retrieve
Data, Update Data and Delete Data from the Database.
Database
Management
System SQL Database
(DBMS)
Your
Tables
Python
Hans-Petter Halvorsen
Python
• Python is a fairly old Programming Language (1991)
compared to many other Programming Languages like C#
(2000), Swift (2014), Java (1995), PHP (1995).
• Python has during the last 10 years become more and more
popular.
• Today, Python has become one of the most popular
Programming Languages.
Software used in this Tutorial:
• Anaconda Distribution (Python + most used
Libraries/Packages are included)
• Spyder Python editor (included with Anaconda Distribution)
Python Drivers for SQL Server
• There are several python SQL drivers available:
– pyodbc
– pymssql
• These Drivers are not made made Microsoft but the
Python Community.
• However, Microsoft places its testing efforts and its
confidence in pyodbc driver.
• Microsoft contributes to the pyODBC open-source
community and is an active participant in the
repository at GitHub
https://docs.microsoft.com/sql/connect/python/python-driver-for-sql-server
pyodbc
• pyodbc is an open-source Python
module that can access ODBC
databases, e.g., SQL Server
• https://pypi.org/project/pyodbc/
• Installation: pip install pyodbc
pyodbc
Python Examples
Hans-Petter Halvorsen
Database CRUD
All Database Systems supports CRUD
C – Create or Insert Data
R – Retrieve Data
U – Update Data
D – Delete Data
Let's go through some Python examples
Python Examples
Note!
• The examples provided can be
considered as a “proof of concept”
• The sample code is simplified for
clarity and doesn't necessarily
represent best practices.
SQL Server Database
Let's Create a simple Table called “BOOK”:
CREATE TABLE [BOOK]
(
[BookId] [int] IDENTITY(1, 1) NOT NULL PRIMARY KEY,
[Title] [varchar](50) NOT NULL UNIQUE,
[Author] [varchar](50) NOT NULL,
[Category] [varchar](50) NOT NULL
)
GO
SQL Server Database
Let’s insert some data into the BOOK Table:
INSERT INTO BOOK (Title, Author, Category)
VALUES ('Python Program','Knut Hamsun', 'Data’)
Go
Connect to Database
using Python
Hans-Petter Halvorsen
Connect to Database from Python
The newest and
recommend driver
import pyodbc
Here is the built-in “sa” user (System Administrator) used to connect to the Database. In
general, you should use another user than the sa user. The sa user is used here for
simplicity. You can easily create new user in SQL Server Management Studio
https://www.halvorsen.blog
Retrieve Data
using Python
Hans-Petter Halvorsen
Python
import pyodbc
1 Python Program Knut Hamsun Data
driver = "{ODBC Driver 17 for SQL Server}"
server = "NUCHPH\\SQLEXPRESS" 2 Music History Elvis Presley Music
database = "BOOKSTORE" 3 Et Dukkehjem Henrik Ibsen Novel
username = "sa"
password = "xxxxxx"
conn = pyodbc.connect("DRIVER=" + driver
+ ";SERVER=" + server
+ ";DATABASE=" + database
+ ";UID=" + username
+ ";PWD=" + password )
cursor = conn.cursor()
cursor = conn.cursor()
connectionString = "DRIVER=" + driver + ";SERVER=" + server + ";DATABASE=" + database + ";UID=" + username + ";PWD=" + password
return connectionString
import pyodbc
import database
connectionString = database.GetConnectionString()
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
Example:
import pyodbc
import database
connectionString = database.GetConnectionString()
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
query = "select BookId, Title, Author, Category from BOOK where Category='Data'"
https://github.com/mkleehammer/pyodbc/wiki/Getting-started
Using Parameters- Avoid SQL Injection
Example:
import pyodbc
import database
connectionString = database.GetConnectionString()
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
query = "select BookId, Title, Author, Category from BOOK where Category=?"
parameters = ['Data']
Insert Data
using Python
Hans-Petter Halvorsen
INSERT
Basic Example:
import pyodbc
import database
connectionString = database.GetConnectionString()
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
query = "INSERT INTO BOOK (Title, Author, Category) VALUES ('Python for Experts', 'Halvorsen', 'Data')"
cursor.execute(query)
cursor.commit()
INSERT with Row Count
With Row Count: You often want to know how many records were inserted. Then
you can use the Cursor rowcount attribute:
import pyodbc
import database
connectionString = database.GetConnectionString()
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
query = "INSERT INTO BOOK (Title, Author, Category) VALUES ('Python for Fun', 'Halvorsen', 'Data')"
count = cursor.execute(query).rowcount
cursor.commit()
import pyodbc
import database
connectionString = database.GetConnectionString()
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
Modify Data
using Python
Hans-Petter Halvorsen
UPDATE
import pyodbc
import database
connectionString = database.GetConnectionString()
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
cursor.execute(query)
cursor.commit()
UPDATE with Row Count
import pyodbc
import database
connectionString = database.GetConnectionString()
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
count = cursor.execute(query).rowcount
cursor.commit()
connectionString = database.GetConnectionString()
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
Delete Data
using Python
Hans-Petter Halvorsen
DELETE
import pyodbc
import database
connectionString = database.GetConnectionString()
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
cursor.execute(query)
cursor.commit()
DELETE with Row Count
import pyodbc
import database
connectionString = database.GetConnectionString()
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
count = cursor.execute(query).rowcount
cursor.commit()
connectionString = database.GetConnectionString()
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
Datalogging Example
Hans-Petter Halvorsen
Datalogging Example
• We can log data from a DAQ device or
similar
• We start by creating a simple Random
Generator that simulates a Temperature
Sensor and log these data to the SQL
Server database
• Then we will in another script read the
data from the database and plot them.
SQL Server Database
Let's create a New Database called, e.g., “LOGGINGSYSTEM”
We insert the following Table:
CREATE TABLE [MEASUREMENTDATA]
(
[MeasurmentId] [int] IDENTITY(1, 1) NOT NULL PRIMARY KEY,
[SensorName] [varchar](50) NOT NULL,
[MeasurementValue] float NOT NULL,
[MeasurementDateTime] datetime NOT NULL
)
GO
import pyodbc
import random
import time
from datetime import datetime
import database
Logging Data
# Connect to Database
connectionString = database.GetConnectionString()
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
query = "INSERT INTO MEASUREMENTDATA (SensorName, MeasurementValue, MeasurementDateTime) VALUES (?,?,?)"
sensorName = "Temperature"
Ts = 10 # Sampling Time
N = 20
for k in range(N):
# Generate Random Data
LowLimit = 20
UpperLimit = 25
measurementValue = random.randint(LowLimit, UpperLimit)
# Wait
time.sleep(Ts)
Logged Data
import pyodbc
import matplotlib.pyplot as plt
import database
sensorName = "Temperature"
Plotting Data
# Connect to Database
connectionString = database.GetConnectionString()
conn = pyodbc.connect(connectionString)
cursor = conn.cursor()
query = "SELECT MeasurementValue, MeasurementDateTime FROM MEASUREMENTDATA WHERE SensorName=?"
parameters = [sensorName]
t = []; data = []
data.append(measurementValue)
t.append(measurementDateTime)
# Plotting
plt.plot(t, data, 'o-')
plt.title('Temperature')
plt.xlabel('t [s]')
plt.ylabel('Temp [degC]')
plt.grid()
plt.show()
Plotted Data
Additional Python Resources
https://www.halvorsen.blog/documents/programming/python/
Hans-Petter Halvorsen
University of South-Eastern Norway
www.usn.no
E-mail: hans.p.halvorsen@usn.no
Web: https://www.halvorsen.blog