Пример #1
0
 def test_where(self):
     play = Play()
     c = Chess()
     q = Query("postgres", unsafe=True)
     prep = q.SELECT(play, c.name).FROM(play, c).WHERE(c.name == NAME)
     self.assertEqual(f"{SELECT_STATEMENT} {FROM}{_CHESS} {WHERE}",
                      prep.print())
Пример #2
0
 def test_base_equality(self):
     h = Holder()
     num = 24
     sql = f"first_name = {num}"
     # self.assertEqual(sql, h.first_name == num)
     base = Base()
     o = h.first_name == 24
     self.assertIsInstance(o, Base)
     self.assertEqual(sql, o.print(Query("postgres", unsafe=True)))
Пример #3
0
from supersql import Query
from supersql import Table

from supersql import Integer, UUID
from supersql import Decimal
from supersql import String

CONFIG = {"vendor": "postgres", "user": "******", "password": "******"}

SQL = """CREATE TABLE account (
\tidentifier uuid PRIMARY KEY NOT NULL DEFAULT uuid_generate_v1(),
\tfirst_name varchar(25),
\tlast_name varchar
)"""

query = Query(**CONFIG)


class Account(Table):
    identifier = UUID(default="uuid_generate_v1()", pk=True, required=True)
    first_name = String(25)
    last_name = String()


def test_create_table():
    account = Account()
    assert (query.CREATE(Account, safe=False).print() == SQL)
Пример #4
0
 def test_vendor_required(self):
     with self.assertRaises(TypeError):
         q = Query()
Пример #5
0
 def test_unsupported(self):
     with self.assertRaises(NotImplementedError):
         q = Query("mongodb")
Пример #6
0
 def test_supported(self):
     for vendor in SUPPORTED_VENDORS:
         q = Query(vendor)
         self.assertIsInstance(q, Query)
Пример #7
0
 def setUp(self):
     self.q = Query("postgres")
     self.p = Play()
     self.c = Chess()
Пример #8
0
class T(TestCase):
    def setUp(self):
        self.q = Query("postgres")
        self.p = Play()
        self.c = Chess()

    def test_from(self):
        EMPTY = ""
        play = Play()
        c = Chess()
        with self.assertRaises(MissingArgumentError):
            prep = self.q.SELECT(play, c.name).FROM()

        prep = self.q.SELECT(play, c.name).FROM(play, c.AS("chess"))
        self.assertEqual(f"{SELECT_STATEMENT} {FROM}{_CHESS}", prep.print())

    def test_supported(self):
        for vendor in SUPPORTED_VENDORS:
            q = Query(vendor)
            self.assertIsInstance(q, Query)

    def test_unsupported(self):
        with self.assertRaises(NotImplementedError):
            q = Query("mongodb")

    def test_vendor_required(self):
        with self.assertRaises(TypeError):
            q = Query()

    def test_select(self):
        prep = self.q.SELECT("*")
        self.assertIsNotNone(prep)
        self.assertIn(SELECT, prep._callstack)

    def test_select_table(self):
        _ = "SELECT name"
        prep = self.q.SELECT(self.c.name)
        self.assertEqual(prep.print(), _)

        # test _from in table
        self.assertGreater(len(prep._tablenames), 0)

        aprep = self.q.SELECT(self.p, self.c.name)
        self.assertEqual(len(aprep._tablenames), 2)

    def test_print_literal(self):
        _ = "SELECT customer_id, age"
        prep = self.q.SELECT("customer_id", "age")
        self.assertEqual(prep.print(), _)

    def test_print_table(self):
        sql = "SELECT cryptic_name, more_cryptic, name"
        play = Play()
        prep = self.q.SELECT(play.cryptic_name, play.more_cryptic, play.name)
        self.assertEqual(prep.print(), sql)

    def test_print_all_table(self):
        sql = "SELECT *"
        play = Play()
        prep = self.q.SELECT(play)
        self.assertEqual(sql, prep.print())

    def test_print_all_table_cols(self):
        sql = "SELECT play.name, play.cryptic_name, play.more_cryptic, chess.name"
        empty = ""
        play = Play()
        c = Chess()
        prep = self.q.SELECT(play, c.name)
        prep_sql = prep.print()
        self.assertEqual(prep_sql, sql)

    def test_alias_parsing(self):
        prep = self.q.SELECT(
            "f.someone",
            "a.hyou",
            "y.me"
        )
        self.assertEqual(len(prep._tablenames), 3)

        prep = self.q.SELECT(
            "a.me",
            "you"
        )
        self.assertEqual(len(prep._tablenames), 1)

        prep = self.q.SELECT("us")
        self.assertFalse(prep._tablenames)

    def test_where(self):
        play = Play()
        c = Chess()
        prep = self.q.SELECT(play, c.name).FROM(play, c).WHERE(
            c.name == NAME
        )
        self.assertEqual(f"{SELECT_STATEMENT} {FROM}{_CHESS} {WHERE}", prep.print())
Пример #9
0
from supersql import Table, Query
from supersql import String

q = Query(vendor="postgres")

first_name = "first_name"
last_name = "last_name"

tablename = "customers"
primary_key = "identifier"
identifier = 511


class Customers(Table):
    identifier = String()
    first_name = String()
    last_name = String()


def test_from():
    expected = "SELECT first_name, last_name FROM customers WHERE identifier = 511"
    assert expected == q.SELECT(first_name, last_name).FROM(tablename).WHERE(
        f"{primary_key} = {identifier}").print()


def test_delete():
    expected = "DELETE FROM customer WHERE identifier = 5"
    assert expected == q.DELETE("customer").WHERE("identifier = 5").print()


def test_delete_with_datatype():
Пример #10
0
from routerling import Router, HttpRequest, ResponseWriter, Context

from ujson import dumps, loads
from supersql import Query, Table, String

query = Query('postgres',
              user="******",
              password="******",
              database="supersql")
router = Router()


class Customer(Table):
    name = String()


async def selector(r, w, c):
    customer = Customer()
    results = await query.SELECT().FROM('customers').WHERE(
        customer.name == 'Kiki').run()
    if not (bool(results)):
        w.status = 404
        return
    row = results.row(1)
    print(len(results._rows))
    w.body = f"{row.column('name')}, {row.title}"


async def editor(r: HttpRequest, w: ResponseWriter, c: Context):
    jsondata = loads(r.body)
    q = query.UPDATE('customers').SET(f"title = '{jsondata.get('title')}'"
Пример #11
0
from supersql import Query

from .schemas.actor import Actor
from .schemas.staff import Staff

query = Query(user='******',
              password='******',
              vendor='postrgres',
              host='localhost:5432/mydatabase')
actor = Actor()

prep = query.SELECT(actor.actor_id, actor.first_name).FROM(actor).WHERE(
    actor.last_name == 'Connery').OFFSET(5).FETCH(10)

fetch_select = """

WITH 
cohort_data AS (
  SELECT sk_customer,
         iso_country_code country,
         FIRST(sk_order) OVER (PARTITION BY sk_customer ORDER BY order_date) sk_first_order,
         FIRST(order_date) OVER (PARTITION BY sk_customer ORDER BY order_date) first_order_date
  FROM f_salesorder_position sale
  LEFT JOIN d_shop shop
  ON sale.sk_shop = shop.sk_shop
  WHERE (sale.sk_order_date BETWEEN {cohort_start} AND {cohort_end}) AND
        sales_channel = 'SHOP'
),

cohort_data2 AS (
  SELECT sk_customer,
Пример #12
0
 def test_engine_required(self):
     with self.assertRaises(TypeError):
         q = Query()
Пример #13
0
class T(TestCase):
    def setUp(self):
        self.q = Query("postgres")
        self.p = Play()
        self.c = Chess()

    def test_alias_parsing(self):
        prep = self.q.SELECT("f.someone", "a.hyou", "y.me")
        self.assertEqual(len(prep._tablenames), 3)

        prep = self.q.SELECT("a.me", "you")
        self.assertEqual(len(prep._tablenames), 1)

        prep = self.q.SELECT("us")
        self.assertFalse(prep._tablenames)

    def test_engine_required(self):
        with self.assertRaises(TypeError):
            q = Query()

    def test_from(self):
        EMPTY = ""
        play = Play()
        c = Chess()
        with self.assertRaises(MissingArgumentError):
            prep = self.q.SELECT(play, c.name).FROM()

        prep = self.q.SELECT(play, c.name).FROM(play, c.AS("chess"))
        self.assertEqual(f"{SELECT_STATEMENT} {FROM}{_CHESS}", prep.print())

    def test_insert_into(self):
        self.assertEqual(
            self.q.INSERT_INTO('customers', (
                'first_name',
                'last_name',
                'age',
            )).VALUES((
                'Marie',
                'Sue',
                25,
            )).print(),
            "INSERT INTO customers (first_name, last_name, age) VALUES ('Marie', 'Sue', 25)"
        )

    def test_insert_multiple(self):
        self.assertEqual(
            self.q.INSERT_INTO('wasabis', (
                'age',
                'title',
            )).VALUES((
                1,
                'Baby',
            ), (
                34,
                'CEO',
            ), (
                12,
                'Student',
            )).print(), INSERT_STATEMENT)

    def test_insert_into_only(self):
        self.assertEqual(
            self.q.INSERT_INTO('customers').print(), 'INSERT INTO customers')
        self.assertEqual(
            self.q.INSERT_INTO('cUstomers',
                               ('first', 'last_name', 'age')).print(),
            'INSERT INTO cUstomers (first, last_name, age)')

    def test_insert_returning(self):
        q = self.q.INSERT_INTO('wasabis').VALUES((
            'Student',
            17,
        ))
        qsql = "INSERT INTO wasabis VALUES ('Student', 17)"
        self.assertEqual(q.print(), qsql)
        self.assertEqual(q.RETURNING('*').print(), f'{qsql} RETURNING *')
        self.assertEqual(
            self.q.INSERT_INTO('wasabis').VALUES(
                ('Student', 17)).RETURNING(self.p.name,
                                           self.p.cryptic_name).print(),
            "INSERT INTO wasabis VALUES ('Student', 17) RETURNING name, cryptic_name"
        )

    def test_supported(self):
        for engine in SUPPORTED_ENGINES[:3]:
            q = Query(engine)
            self.assertIsInstance(q, Query)

    def test_select(self):
        prep = self.q.SELECT("*")
        self.assertIsNotNone(prep)
        self.assertIn(SELECT, prep._callstack)

    def test_select_table(self):
        _ = "SELECT name"
        prep = self.q.SELECT(self.c.name)
        self.assertEqual(prep.print(), _)

        # test _from in table
        self.assertGreater(len(prep._tablenames), 0)

        aprep = self.q.SELECT(self.p, self.c.name)
        self.assertEqual(len(aprep._tablenames), 2)

    def test_print_literal(self):
        _ = "SELECT customer_id, age"
        prep = self.q.SELECT("customer_id", "age")
        self.assertEqual(prep.print(), _)

    def test_print_table(self):
        sql = "SELECT cryptic_name, more_cryptic, name"
        play = Play()
        prep = self.q.SELECT(play.cryptic_name, play.more_cryptic, play.name)
        self.assertEqual(prep.print(), sql)

    def test_print_all_table(self):
        sql = "SELECT *"
        play = Play()
        prep = self.q.SELECT(play)
        self.assertEqual(sql, prep.print())

    def test_print_all_table_cols(self):
        sql = "SELECT play.age, play.name, play.cryptic_name, play.more_cryptic, chess.name"
        empty = ""
        play = Play()
        c = Chess()
        prep = self.q.SELECT(play, c.name)
        prep_sql = prep.print()
        self.assertEqual(prep_sql, sql)

    def test_unsupported(self):
        with self.assertRaises(NotImplementedError):
            q = Query("mongodb")

    def test_Update(self):
        # Validate query? Later...
        q = self.q.UPDATE('customers').SET(self.p.age << 34).WHERE(
            self.p.cryptic_name == 5)
        self.assertEqual(
            q.print(), "UPDATE customers SET age = $1 WHERE cryptic_name = $2")
        self.assertEqual(q._args, [34, 5])

        q = self.q.UPDATE(self.p).SET(self.p.name << 'Yimu')
        self.assertEqual(q.print(), "UPDATE play SET name = $1")
        self.assertEqual(q.args, ['Yimu'])

    def test_where(self):
        play = Play()
        c = Chess()
        q = Query("postgres", unsafe=True)
        prep = q.SELECT(play, c.name).FROM(play, c).WHERE(c.name == NAME)
        self.assertEqual(f"{SELECT_STATEMENT} {FROM}{_CHESS} {WHERE}",
                         prep.print())

    def test_query_into(self):
        q = self.q.INSERT_INTO('customers',
                               ('a', 'b', 'c')).SELECT('x', 'y',
                                                       'z').FROM('extra')
        q = q.WHERE('x = 5')
        sql = "INSERT INTO customers (a, b, c) SELECT x, y, z FROM extra WHERE x = 5"
        self.assertEqual(q.print(), sql)

    def test_query_begin(self):
        q = self.q.BEGIN()
        sql = 'BEGIN'
        self.assertEqual(q.print(), sql)
        self.assertTrue(q._pause_cloning, True)

        q.INSERT_INTO('accounts', (
            'email',
            'password',
        ))
        sql = f'{sql}; INSERT INTO accounts (email, password)'
        self.assertEqual(q.print(), sql)

        q.SELECT('a', 'b', 'c').FROM('customers')
        sql = f'{sql} SELECT a, b, c FROM customers'
        self.assertEqual(q.print(), sql)

        q.COMMIT()
        self.assertEqual(q.print(), f'{sql}; COMMIT;')

        # now do it again but without insert_into preceeding select to ensure semicolon is seen
        q = self.q.BEGIN()
        sql = "BEGIN; UPDATE customers SET a = 5, b = 8 WHERE id = 't'"
        q.UPDATE('customers').SET('a = 5', 'b = 8').WHERE("id = 't'")
        self.assertEqual(q.print(), sql)

        q = q.SELECT().FROM('wasabis').WHERE('id = 100').RETURNING(
            'id').COMMIT()
        sql = f'{sql}; SELECT * FROM wasabis WHERE id = 100 RETURNING id; COMMIT;'
        self.assertEqual(q.print(), sql)
Пример #14
0
 def test_supported(self):
     for engine in SUPPORTED_ENGINES[:3]:
         q = Query(engine)
         self.assertIsInstance(q, Query)