mirror of
https://github.com/postgres/postgres.git
synced 2025-06-25 01:02:05 +03:00
Fix some quoting functions. In particular handle NULLs better. Use a method to add primary key information rather than direct manipulation of the class structures. Break decimal out in _quote (in pg.py) and treat it as float. Treat timestamp like date for quoting purposes. Remove a redundant SELECT from the get method speeding it, and insert since it calls get, up a little. Add test for BOOL type in typecast method to pgdbTypeCache class. (tv@beamnet.de) Fix pgdb.py to send port as integer to lower level function (dildog@l0pht.com) Change pg.py to speed up some operations Allow updates on tables with no primary keys. D'Arcy J.M. Cain
297 lines
10 KiB
Python
Executable File
297 lines
10 KiB
Python
Executable File
#! /usr/bin/env python
|
|
# basics.py - basic SQL commands tutorial
|
|
# inspired from the Postgres95 tutorial
|
|
# adapted to Python 1995 by Pascal ANDRE
|
|
|
|
print """
|
|
__________________________________________________________________
|
|
MODULE BASICS.PY : BASIC POSTGRES SQL COMMANDS TUTORIAL
|
|
|
|
This module is designed for being imported from python prompt
|
|
|
|
In order to run the samples included here, first create a connection
|
|
using : cnx = basics.DB(...)
|
|
|
|
The "..." should be replaced with whatever arguments you need to open an
|
|
existing database. Usually all you need is the name of the database and,
|
|
in fact, if it is the same as your login name, you can leave it empty.
|
|
|
|
then start the demo with: basics.demo(cnx)
|
|
__________________________________________________________________
|
|
"""
|
|
|
|
from pg import DB
|
|
import sys
|
|
|
|
# waits for a key
|
|
def wait_key():
|
|
print "Press <enter>"
|
|
sys.stdin.read(1)
|
|
|
|
# table creation commands
|
|
def create_table(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Creating a table:"
|
|
print "-- a CREATE TABLE is used to create base tables. POSTGRES"
|
|
print "-- SQL has its own set of built-in types. (Note that"
|
|
print "-- keywords are case-insensitive but identifiers are "
|
|
print "-- case-sensitive.)"
|
|
print "-----------------------------"
|
|
print
|
|
print "Sending query :"
|
|
print "CREATE TABLE weather ("
|
|
print " city varchar(80),"
|
|
print " temp_lo int,"
|
|
print " temp_hi int,"
|
|
print " prcp float8,"
|
|
print " date date"
|
|
print ")"
|
|
pgcnx.query("""CREATE TABLE weather (city varchar(80), temp_lo int,
|
|
temp_hi int, prcp float8, date date)""")
|
|
print
|
|
print "Sending query :"
|
|
print "CREATE TABLE cities ("
|
|
print " name varchar(80),"
|
|
print " location point"
|
|
print ")"
|
|
pgcnx.query("""CREATE TABLE cities (
|
|
name varchar(80),
|
|
location point)""")
|
|
|
|
# data insertion commands
|
|
def insert_data(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Inserting data:"
|
|
print "-- an INSERT statement is used to insert a new row into"
|
|
print "-- a table. There are several ways you can specify what"
|
|
print "-- columns the data should go to."
|
|
print "-----------------------------"
|
|
print
|
|
print "-- 1. the simplest case is when the list of value correspond to"
|
|
print "-- the order of the columns specified in CREATE TABLE."
|
|
print
|
|
print "Sending query :"
|
|
print "INSERT INTO weather "
|
|
print " VALUES ('San Francisco', 46, 50, 0.25, '11/27/1994')"
|
|
pgcnx.query("""INSERT INTO weather
|
|
VALUES ('San Francisco', 46, 50, 0.25, '11/27/1994')""")
|
|
print
|
|
print "Sending query :"
|
|
print "INSERT INTO cities "
|
|
print " VALUES ('San Francisco', '(-194.0, 53.0)')"
|
|
pgcnx.query("""INSERT INTO cities
|
|
VALUES ('San Francisco', '(-194.0, 53.0)')""")
|
|
print
|
|
wait_key()
|
|
print "-- 2. you can also specify what column the values correspond "
|
|
print " to. (The columns can be specified in any order. You may "
|
|
print " also omit any number of columns. eg. unknown precipitation"
|
|
print " below)"
|
|
print "Sending query :"
|
|
print "INSERT INTO weather (city, temp_lo, temp_hi, prcp, date)"
|
|
print " VALUES ('San Francisco', 43, 57, 0.0, '11/29/1994')"
|
|
pgcnx.query("INSERT INTO weather (date, city, temp_hi, temp_lo)" \
|
|
"VALUES ('11/29/1994', 'Hayward', 54, 37)")
|
|
|
|
# direct selection commands
|
|
def select_data1(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Retrieving data:"
|
|
print "-- a SELECT statement is used for retrieving data. The "
|
|
print "-- basic syntax is:"
|
|
print "-- SELECT columns FROM tables WHERE predicates"
|
|
print "-----------------------------"
|
|
print
|
|
print "-- a simple one would be the query:"
|
|
print "SELECT * FROM weather"
|
|
print
|
|
print "The result is :"
|
|
q = pgcnx.query("SELECT * FROM weather")
|
|
print q
|
|
print
|
|
print "-- you may also specify expressions in the target list (the "
|
|
print "-- 'AS column' specifies the column name of the result. It is "
|
|
print "-- optional.)"
|
|
print "The query :"
|
|
print " SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date "
|
|
print " FROM weather"
|
|
print "Gives :"
|
|
print pgcnx.query("""SELECT city, (temp_hi+temp_lo)/2
|
|
AS temp_avg, date FROM weather""")
|
|
print
|
|
print "-- if you want to retrieve rows that satisfy certain condition"
|
|
print "-- (ie. a restriction), specify the condition in WHERE. The "
|
|
print "-- following retrieves the weather of San Francisco on rainy "
|
|
print "-- days."
|
|
print "SELECT *"
|
|
print "FROM weather"
|
|
print "WHERE city = 'San Francisco' "
|
|
print " and prcp > 0.0"
|
|
print pgcnx.query("""SELECT * FROM weather WHERE city = 'San Francisco'
|
|
AND prcp > 0.0""")
|
|
print
|
|
print "-- here is a more complicated one. Duplicates are removed when "
|
|
print "-- DISTINCT is specified. ORDER BY specifies the column to sort"
|
|
print "-- on. (Just to make sure the following won't confuse you, "
|
|
print "-- DISTINCT and ORDER BY can be used separately.)"
|
|
print "SELECT DISTINCT city"
|
|
print "FROM weather"
|
|
print "ORDER BY city;"
|
|
print pgcnx.query("SELECT DISTINCT city FROM weather ORDER BY city")
|
|
|
|
# selection to a temporary table
|
|
def select_data2(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Retrieving data into other classes:"
|
|
print "-- a SELECT ... INTO statement can be used to retrieve "
|
|
print "-- data into another class."
|
|
print "-----------------------------"
|
|
print
|
|
print "The query :"
|
|
print "SELECT * INTO TABLE temptab "
|
|
print "FROM weather"
|
|
print "WHERE city = 'San Francisco' "
|
|
print " and prcp > 0.0"
|
|
pgcnx.query("""SELECT * INTO TABLE temptab FROM weather
|
|
WHERE city = 'San Francisco' and prcp > 0.0""")
|
|
print "Fills the table temptab, that can be listed with :"
|
|
print "SELECT * from temptab"
|
|
print pgcnx.query("SELECT * from temptab")
|
|
|
|
# aggregate creation commands
|
|
def create_aggregate(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Aggregates"
|
|
print "-----------------------------"
|
|
print
|
|
print "Let's consider the query :"
|
|
print "SELECT max(temp_lo)"
|
|
print "FROM weather;"
|
|
print pgcnx.query("SELECT max(temp_lo) FROM weather")
|
|
print
|
|
print "-- Aggregate with GROUP BY"
|
|
print "SELECT city, max(temp_lo)"
|
|
print "FROM weather "
|
|
print "GROUP BY city;"
|
|
print pgcnx.query( """SELECT city, max(temp_lo)
|
|
FROM weather GROUP BY city""")
|
|
|
|
# table join commands
|
|
def join_table(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Joining tables:"
|
|
print "-- queries can access multiple tables at once or access"
|
|
print "-- the same table in such a way that multiple instances"
|
|
print "-- of the table are being processed at the same time."
|
|
print "-----------------------------"
|
|
print
|
|
print "-- suppose we want to find all the records that are in the "
|
|
print "-- temperature range of other records. W1 and W2 are aliases "
|
|
print "--for weather."
|
|
print
|
|
print "SELECT W1.city, W1.temp_lo, W1.temp_hi, "
|
|
print " W2.city, W2.temp_lo, W2.temp_hi"
|
|
print "FROM weather W1, weather W2"
|
|
print "WHERE W1.temp_lo < W2.temp_lo "
|
|
print " and W1.temp_hi > W2.temp_hi"
|
|
print
|
|
print pgcnx.query("""SELECT W1.city, W1.temp_lo, W1.temp_hi,
|
|
W2.city, W2.temp_lo, W2.temp_hi FROM weather W1, weather W2
|
|
WHERE W1.temp_lo < W2.temp_lo and W1.temp_hi > W2.temp_hi""")
|
|
print
|
|
print "-- let's join two tables. The following joins the weather table"
|
|
print "-- and the cities table."
|
|
print
|
|
print "SELECT city, location, prcp, date"
|
|
print "FROM weather, cities"
|
|
print "WHERE name = city"
|
|
print
|
|
print pgcnx.query("""SELECT city, location, prcp, date FROM weather, cities
|
|
WHERE name = city""")
|
|
print
|
|
print "-- since the column names are all different, we don't have to "
|
|
print "-- specify the table name. If you want to be clear, you can do "
|
|
print "-- the following. They give identical results, of course."
|
|
print
|
|
print "SELECT w.city, c.location, w.prcp, w.date"
|
|
print "FROM weather w, cities c"
|
|
print "WHERE c.name = w.city;"
|
|
print
|
|
print pgcnx.query("""SELECT w.city, c.location, w.prcp, w.date
|
|
FROM weather w, cities c WHERE c.name = w.city""")
|
|
|
|
# data updating commands
|
|
def update_data(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Updating data:"
|
|
print "-- an UPDATE statement is used for updating data. "
|
|
print "-----------------------------"
|
|
print
|
|
print "-- suppose you discover the temperature readings are all off by"
|
|
print "-- 2 degrees as of Nov 28, you may update the data as follow:"
|
|
print
|
|
print "UPDATE weather"
|
|
print " SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2"
|
|
print " WHERE date > '11/28/1994'"
|
|
print
|
|
pgcnx.query("""UPDATE weather
|
|
SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2
|
|
WHERE date > '11/28/1994'""")
|
|
print
|
|
print "SELECT * from weather"
|
|
print pgcnx.query("SELECT * from weather")
|
|
|
|
# data deletion commands
|
|
def delete_data(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Deleting data:"
|
|
print "-- a DELETE statement is used for deleting rows from a "
|
|
print "-- table."
|
|
print "-----------------------------"
|
|
print
|
|
print "-- suppose you are no longer interested in the weather of "
|
|
print "-- Hayward, you can do the following to delete those rows from"
|
|
print "-- the table"
|
|
print
|
|
print "DELETE FROM weather WHERE city = 'Hayward'"
|
|
pgcnx.query("DELETE FROM weather WHERE city = 'Hayward'")
|
|
print
|
|
print "SELECT * from weather"
|
|
print
|
|
print pgcnx.query("SELECT * from weather")
|
|
print
|
|
print "-- you can also delete all the rows in a table by doing the "
|
|
print "-- following. (This is different from DROP TABLE which removes "
|
|
print "-- the table in addition to the removing the rows.)"
|
|
print
|
|
print "DELETE FROM weather"
|
|
pgcnx.query("DELETE FROM weather")
|
|
print
|
|
print "SELECT * from weather"
|
|
print pgcnx.query("SELECT * from weather")
|
|
|
|
# table removal commands
|
|
def remove_table(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Removing the tables:"
|
|
print "-- DROP TABLE is used to remove tables. After you have"
|
|
print "-- done this, you can no longer use those tables."
|
|
print "-----------------------------"
|
|
print
|
|
print "DROP TABLE weather, cities, temptab"
|
|
pgcnx.query("DROP TABLE weather, cities, temptab")
|
|
|
|
# main demo function
|
|
def demo(pgcnx):
|
|
create_table(pgcnx)
|
|
wait_key()
|
|
insert_data(pgcnx)
|
|
wait_key()
|
|
select_data1(pgcnx)
|
|
select_data2(pgcnx)
|
|
create_aggregate(pgcnx)
|
|
join_table(pgcnx)
|
|
update_data(pgcnx)
|
|
delete_data(pgcnx)
|
|
remove_table(pgcnx)
|