connect04.gms : Simple Connect Example for SQL

Description

This model uses GAMS Connect to read and write to SQL

Contributor: Vaibhavnath Jha, July 2022


Category : GAMS Data Utilities library


Main file : connect04.gms   includes :  connect04.gms

$title 'Simple Connect Example for SQL' (CONNECT04,SEQ=147)

$ontext
This model uses GAMS Connect to read and write to SQL

Contributor: Vaibhavnath Jha, July 2022
$offtext


$onEchoV > whouse.sql
DROP TABLE IF EXISTS [timeTable];
DROP TABLE IF EXISTS [priceTable];
DROP TABLE IF EXISTS [iniStockTable];
DROP TABLE IF EXISTS [storeCostTable];
DROP TABLE IF EXISTS [storeCapTable];

CREATE TABLE [timeTable]
(
    [t_qrt] NVARCHAR(15) PRIMARY KEY
);
INSERT INTO [timeTable] ([t_qrt]) VALUES("q-1");
INSERT INTO [timeTable] ([t_qrt]) VALUES("q-2");
INSERT INTO [timeTable] ([t_qrt]) VALUES("q-3");
INSERT INTO [timeTable] ([t_qrt]) VALUES("q-4");

CREATE TABLE [priceTable]
(
    [t_qrt] NVARCHAR(15) PRIMARY KEY,
    [price] NUMERIC(10,3)
);
INSERT INTO [priceTable] ([t_qrt], [price]) VALUES("q-1", 10);
INSERT INTO [priceTable] ([t_qrt], [price]) VALUES("q-2", 12);
INSERT INTO [priceTable] ([t_qrt], [price]) VALUES("q-3", 8);
INSERT INTO [priceTable] ([t_qrt], [price]) VALUES("q-4", 9);


CREATE TABLE [iniStockTable]
(
    [t_qrt] NVARCHAR(15) PRIMARY KEY,
    [stock] NUMERIC(10,3)
);
INSERT INTO [iniStockTable] ([t_qrt], [stock]) VALUES("q-1", 50);


CREATE TABLE [storeCostTable] 
(
    [cost] NUMERIC(5, 4) PRIMARY KEY
);
INSERT INTO [storeCostTable] ([cost]) VALUES(1);

CREATE TABLE [storeCapTable] 
(
    [cap] NUMERIC(5, 4) PRIMARY KEY
);
INSERT INTO [storeCapTable] ([cap]) VALUES(100);
$offEcho

$onEmbeddedCode Python:
import sqlite3

with open('whouse.sql', 'r') as sql_file:
    sql_script = sql_file.read()
  
with sqlite3.connect('whouse.db') as sqliteConnection:    
    cursor = sqliteConnection.cursor()
    cursor.executescript(sql_script)
    cursor.close()
$offEmbeddedCode

Set t 'time in quarters';

Parameter
   price(t)  'selling price ($ per unit)'
   istock(t) 'initial stock      (units)';

Scalar
   storecost 'storage cost  ($ per quarter per unit)'
   storecap  'stocking capacity of warehouse (units)';

$onEmbeddedCode Connect:
- SQLReader:
    connection: {"database": "whouse.db"}
    symbols:
      - name: t
        query: "SELECT * FROM timeTable;"
        type: set
      - name: price
        query: "SELECT * FROM priceTable;"
      - name: istock
        query: "SELECT * FROM iniStockTable;"
      - name: storecost
        query: "SELECT * FROM storeCostTable;"
      - name: storecap
        query: "SELECT * FROM storeCapTable;"
- GAMSWriter:
    writeAll: True
$offEmbeddedCode

Variable
   stock(t)  'stock stored at time t (units)'
   sell(t)   'stock sold at time t   (units)'
   buy(t)    'stock bought at time t (units)'
   cost      'total cost                 ($)';
Positive Variable stock, sell, buy;

Equation
   sb(t)     'stock balance at time t (units)'
   at        'accounting: total cost      ($)';

sb(t).. stock(t) =e= stock(t-1) + buy(t) - sell(t)  + istock(t);

at..    cost =e= sum(t, price(t)*(buy(t) - sell(t)) + storecost*stock(t));

stock.up(t) = storecap;

Model swp 'simple warehouse problem' / all /;

solve swp minimizing cost using lp;

EmbeddedCode Connect:
- GAMSReader:
    readAll: True
- Projection:
    name: stock.l(t)
    newName: stock_level(t)
- Projection:
    name: sell.l(t)
    newName: sell_level(t)
- Projection:
    name: buy.l(t)
    newName: buy_level(t)
- SQLWriter:
    connection: {"database": "whouse.db"}
    ifExists: replace
    symbols:
      - name: stock_level
        tableName: stock_level
      - name: sell_level
        tableName: sell_level
      - name: buy_level
        tableName: buy_level
endEmbeddedCode