SlideShare a Scribd company logo
1 of 97
Download to read offline
SQLAlchemy Primer
(extra content)
for Kobe Python Meetup #13
2017/09/15 Kobe Japan
Yasushi Masuda PhD
( @whosaysni )
Tech team, Core IT grp. IT Dept.
MonotaRO Co., LTD.
Pythonista since 2001 (2.0~)
• elaphe (barcode library)
• oikami.py (老神.py)
• PyCon JP founder
Japanese Translation works
Agenda
Myths
Core concepts in SQLAlchemy



Engine basics (+hands-on)
ORM primer (+hans-on)
References
Online Document:

http://docs.sqlalchemy.org/
en/rel_1_1/



(Old) Japanese translation:

http://omake.accense.com/
static/doc-ja/sqlalchemy/
Preparation
sakila DB on SQLite http://bit.ly/2fdeeft
https://github.com/jOOQ/jOOQ/jOOQ-examples/Sakila/sqlite-sakila-db/sqlite-sakila.sq
Sakila
• Demonstration
DB for MySQL
• Models a rental
video shop
• BSD License
Schema described at:
https://dev.mysql.com/doc/sakila/en/sakila-structure-tables.html
Myths
[WRONG!] It's just an ORM library

Not limited to. SQLAlchemy is a DB manipulation framework.
[WRONG!] SA is built on ORM

NO. Connection management and SQL expression framework are its core.

ORM is built on them.



[WRONG!] SA cannot handle raw SQL

Table definition is not required. Even textual SQL is available.
[WRONG!] SA automatically escapes value for you

SQLAlchemy relies value escaping on DB-API, while it escapes schema, table, column
names. SQLAlchemy generates parameterized query that helps DB-API level escaping.
[WRONG!] Only Python adept can handle SA

SQLAlchemy is EASY. You may need SQL and RDBMS experience. Let's see!
[AGREE] Documentation is somewhat difficult to understand

Agreed.
Core concepts
http://docs.sqlalchemy.org/en/latest/index.html
http://docs.sqlalchemy.org/en/latest/index.html
SQLAlchemy Core
Engine (connection)
Schema definition

SQL Expression
SQLAlchemy ORM
Mapper
Declarative Mapper
Session
Dialect
DB Backend-specific functionalities
Engine
manages DB connection(s)
SQL Expression

describes SQL statement in Python
Mapping

reflects DB record with Python object
Dialect
DB Backend specific functionalities
Database
Your program
SQL
construction
Query
execution
Type

conversion
Parameter
binding
Driver
Setup
Connection
management
Result
data structure
Value
escaping
Schema
name
Type conversion
Dialect-
specific
Query Construction
Query Execution
Result
Schema object
Object-relational
mapping
High-level Interface
DB Session
Engine
DB API DB ServerProgram
Issues around DB-API
Which DB-API to use
How to initialize the DB-API
How to generate valid query for it
How to handle cursor on the DB-API
How to execute query on the DB-API
How to retrieve result from DB-API
How to reserve/reuse connection
DB API DB ServerProgram
Engine resolves issues
Select DB-API from DSN URL
Initialize DB-API for you
Accept string and SQL expression
Manage cursor for you
Unify execution/transaction API
Handle result via ResultProxy
Pool connection automatically
Engine
Engine DB API DB ServerProgram
>>>	from	sqlalchemy	import	create_engine

>>>
Engine DB API DB ServerProgram
>>>	from	sqlalchemy	import	create_engine

>>>	e	=	create_engine('sqlite://')		#	SQLite	memory	engine

>>>
Engine DB API DB ServerProgram
#	Use	URL	for	specifying	database

>>>	e	=	create_engine('sqlite://')		#	SQLite	memory	engine

>>>	e	=	create_engine('sqlite:///path_to_db.sqlite3')		#	sqlite3

>>>	e	=	create_engine('mysql://scott:tiger@dbserv/dbname')		#	mysql

>>>	e	=	create_engine('mssql://bill:gates@dbserv/dbname')		#	mssql

>>>
Engine DB API DB ServerProgram
#	Be	careful	with	number	of	slashes

>>>	e	=	create_engine('sqlite:///sqlite-sakila.sq')

>>>	e	=	create_engine('sqlite:////<absolute_path>/sqlite-sakila.sq')
Engine DB API DB ServerProgram
>>>	e	=	create_engine('sqlite:///sqlite-sakila.sq')

>>>	e

Engine(sqlite:///sakila-data.sq)

#	execute	returns	ResultProxy

>>>	q	=	'select	title	from	film	limit	5')

>>>	res	=	e.execute(q)

>>>	res

<sqlalchemy.engine.result.ResultProxy	object	at	0x10da96990>

>>>
Engine DB API DB ServerProgram
>>>	e	=	create_engine('sqlite:///sqlite-sakila.sq')

>>>	e

Engine(sqlite:///sakila-data.sq)

#	execute	returns	ResultProxy

>>>	q	=	'select	title	from	film	limit	5')

>>>	res	=	e.execute(q)

>>>	res

<sqlalchemy.engine.result.ResultProxy	object	at	0x10da96990

>>>	for	row	in	res:		#	ResultProxy	can	be	iterated/namedtuple	access

...					print(row.title)

...	

ACADEMY	DINOSAUR

ACE	GOLDFINGER

ADAPTATION	HOLES

AFFAIR	PREJUDICE

AFRICAN	EGG

>>>
Engine DB API DB ServerProgram
>>>	q	=	'select	film_id,	title	from	film	limit	10'

>>>	rows	=	list(e.execute(q))

>>>	rows[2][1]	#	each	row	is	accessible	like	as	tuple

'ADAPTATION	HOLES'

>>>	rows[4]['title']	#	row	can	be	accessible	like	as	dictionary

'AFRICAN	EGG'

>>>	res	=	e.execute(q)

>>>	for	fid,	title	in	res:	#	can	be	expanded	as	normal	tuple

...					print((fid,	title))

...	

(1,	'ACADEMY	DINOSAUR')

(2,	'ACE	GOLDFINGER')

(3,	'ADAPTATION	HOLES')

(4,	'AFFAIR	PREJUDICE')

(5,	'AFRICAN	EGG')

>>>	rows	=	list(e.execute(q))

>>>
transaction
>>>	t	=	e.begin()

>>>	t.transaction

<sqlalchemy...RootTransaction	object	at	...>

>>>	t.transaction.commit()

#	with	statement	handles	transaction	smart

>>>	with	e.begin():

								e.execute(...)

>>>	#	(transaction	committed	automatically)

HANDS ON: Engine basics
Connect	to	sqlite-
sakila.sq	database

List	actors	in	film	
"DINOSAUR	SECRETARY"
HANDS ON: Engine basics
>>>	e	=	create_engine('sqlite:///sqlite-sakila.sq')

>>>	q	=	'''select	a.first_name,	a.last_name

...					from	film	as	f	

...									inner	join	film_actor	as	fa	

...													on	f.film_id=fa.film_id	

...									inner	join	actor	as	a

...													on	fa.actor_id=a.actor_id	

...					where	f.title	=	"DINOSAUR	SECRETARY"'''

>>>	for	first_name,	last_name	in	e.execute(q):

...					print('{}	{}'.format(first_name,	last_name))

...

LUCILLE	TRACY

BURT	DUKAKIS

JAYNE	NEESON

RUSSELL	BACALL

PENELOPE	MONROE

MINNIE	KILMER
SQL expression
Remember: SQL is a language
SELECT	[	ALL	|	DISTINCT	[	ON	(	expression	[,	...]	)	]	]

				[	*	|	expression	[	[	AS	]	output_name	]	[,	...]	]

				[	FROM	from_item	[,	...]	]

				[	WHERE	condition	]

				[	GROUP	BY	grouping_element	[,	...]	]

				[	ORDER	BY	expression

								[	ASC	|	DESC	|	USING	operator	]

								[	NULLS	{	FIRST	|	LAST	}	]	[,	...]	]

				[	LIMIT	{	count	|	ALL	}	]
Remember: SQL is a language
SELECT	[	ALL	|	DISTINCT	[	ON	(	expression	[,	...]	)	]	]

				[	*	|	expression	[	[	AS	]	output_name	]	[,	...]	]

				[	FROM	from_item	[,	...]	]

				[	WHERE	condition	]

				[	GROUP	BY	grouping_element	[,	...]	]

				[	ORDER	BY	expression

								[	ASC	|	DESC	|	USING	operator	]

								[	NULLS	{	FIRST	|	LAST	}	]	[,	...]	]

				[	LIMIT	{	count	|	ALL	}	]
STATEMENT
Remember: SQL is a language
SELECT	[	ALL	|	DISTINCT	[	ON	(	expression	[,	...]	)	]	]

				[	*	|	expression	[	[	AS	]	output_name	]	[,	...]	]

				[	FROM	from_item	[,	...]	]

				[	WHERE	condition	]

				[	GROUP	BY	grouping_element	[,	...]	]

				[	ORDER	BY	expression

								[	ASC	|	DESC	|	USING	operator	]

								[	NULLS	{	FIRST	|	LAST	}	]	[,	...]	]

				[	LIMIT	{	count	|	ALL	}	]
CLAUSE
CLAUSE
CLAUSE
CLAUSE
CLAUSE
CLAUSE
Remember: SQL is a language
SELECT	[	ALL	|	DISTINCT	[	ON	(	expression	[,	...]	)	]	]

				[	*	|	expression	[	[	AS	]	output_name	]	[,	...]	]

				[	FROM	from_item	[,	...]	]

				[	WHERE	condition	]

				[	GROUP	BY	grouping_element	[,	...]	]

				[	ORDER	BY	expression

								[	ASC	|	DESC	|	USING	operator	]

								[	NULLS	{	FIRST	|	LAST	}	]	[,	...]	]

				[	LIMIT	{	count	|	ALL	}	]
parameter
parameter
expression
expression
expression
expression
expression
expression
Remember: SQL is a Language
SELECT
FROM selectables
selectable
join
WHERE
selectable
selectable
GROUP BY
ORDER BY
expression
expression
condition
expression
expressions
expression
expression
SELECT statement
SELECT	A.name,	B.title,	C.title

FROM	artists	as	A

				INNER	JOIN	album	as	B	ON	A.id	=	B.artist_id

				INNER	JOIN	music	as	C	ON	B.id	=	C.album

WHERE	A.name	LIKE	'%Astor%'

				AND	A.year	BETWEEN	1970	AND	2010

				AND	C.title	LIKE	'%Tango%'
From SQL to Python
SELECT	<column>,	<column>,	...

FROM	<selectable>

				INNER	JOIN	<selectable>	ON	<condition>

				INNER	JOIN	<selectable>	ON	<condition>

				...

WHERE	<condition>

				AND	<condition>

				AND	<condition>

GROUP	BY	...

LIMIT	...
Clauses
SELECT	<[<column>,	<column>,	<column>]>

FROM	<join	(<selectable>,	<selectable>,	...)>

WHERE	<and	(<condition>,	<condition>,	...)>
Statement and subjects
SELECT	<expressions>

FROM	<selectable>

WHERE	<conditions>
... simplifed
<select	statement>
..., finally
engine.execute(<select	statement>)
If query is "an object"...
Query object
>>>	query	=	select(...)

>>>	engine.execute(query)
... it can be "execute()-able"
Engine "compiles" query
into string and execute it
(according to dialect)
query	=	select(

			<expression>,

			from_obj=<selectables>,

			whereclause=<conditions>,

)
clauses as parameters
columns	=	[col1,	col2,	...]

fromobj	=	join(tbl1,	tbl2,	...)

where	=	and_(expr1,	expr2,	...)

query_expr	=	select(

			columns,	from_obj=fromobj,

			whereclause=where)
query with SQL expression
>>>	from	sqlalchemy.sql	import	select,	text

>>>	q	=	select([text('*')])

building sql statement with
basic sql expression
>>>	from	sqlalchemy.sql	import	select,	text

>>>	q	=	select([text('*')])

>>>	q

<sqlalchemy.....Select	at	...;	Select	object>

>>>	str(q)

'SELECT	*'

>>>	q	=	select([text('*')],

...					from_obj=text('foo'),	

...					whereclause=text('id=3'))

>>>	str(q)

'SELECT	*	nFROM	foo	nWHERE	id=3'
building sql statement with
basic sql expression
>>>	from	sqlalchemy.sql	import	select,	text

>>>	q	=	select([text('*')])

>>>	q

<sqlalchemy.....Select	at	...;	Select	object>

>>>	str(q)

'SELECT	*'

>>>	q	=	select([text('*')],

...					from_obj=text('foo'),	

...					whereclause=text('id=3'))

>>>	str(q)

'SELECT	*	nFROM	foo	nWHERE	id=3'
building sql statement with
basic sql expression
elements: table and column
Schema
Table Table Table
...
Column
Column
Column
...
Column
Column
Column
...
Column
Column
Column
...
Schema
Table Table Table
Column
Column
Column
Column
Column
Column
...
elements: table and column
>>>	from	sqlalchemy.sql	import	column,	table

>>>	from	sqlalchemy	import	INTEGER
elements: table and column
>>>	from	sqlalchemy.sql	import	column,	table

>>>	from	sqlalchemy	import	INTEGER

>>>	c	=	column('name')	#	simplest

>>>	c	=	column('name',	type_=INTEGER)
elements: table and column
>>>	from	sqlalchemy.sql	import	column,	table

>>>	from	sqlalchemy	import	INTEGER

>>>	c	=	column('name')	#	simplest

>>>	c	=	column('name',	type_=INTEGER)

>>>	c

<sqlalchemy....ColumnClause	at	...;	name>

>>>	str(c)

'name'
elements: table and column
>>>	from	sqlalchemy.sql	import	column,	table

>>>	from	sqlalchemy	import	INTEGER

>>>	c	=	column('name')	#	simplest

>>>	c	=	column('name',	type_=INTEGER)

>>>	c

<sqlalchemy....ColumnClause	at	...;	name>

>>>	str(c)

'name'

>>>	c.table		#	None

>>>	t1	=	table('artist')

>>>	c.table	=	t1

>>>	str(c)

'artist.name'
>>>	t	=	table('tbl1',	column('col1'),	...)

defining table with columns
Table name List of columns
>>>	t	=	table('tbl1',	column('col1'),	...)

>>>	t.c.col1

<sqlalchemy.....ColumnClause	at	...;	col1>

defining table with columns
Table name List of columns
>>>	t	=	table('tbl1',	column('col1'),	...)

>>>	t.c.col1

<sqlalchemy.....ColumnClause	at	...;	col1>

>>>	t.schema	=	'db1'

>>>	str(t.c.col1)

'db1.tbl1.col1'

defining table with columns
Table name List of columns
>>>	t	=	table('tbl1',	column('col1'),	column('col2'))

select() with table element
>>>	t	=	table('tbl1',	column('col1'),	column('col2'))

>>>	print(select([t]))

SELECT	tbl1.col1,	tbl1.col2

FROM	tbl1

select() with table element
>>>	t	=	table('tbl1',	column('col1'),	column('col2'))

>>>	print(select([t]))

SELECT	tbl1.col1,	tbl1.col2

FROM	tbl1

#	column	labeling

>>>	print(select([t.c.col1.label('col_alias1')])

SELECT	tbl1.col1	as	"col_alias1"

FROM	tbl1

select() with table element
>>>	t	=	table('tbl1',	column('col1'),	column('col2'))

>>>	print(select([t]))

SELECT	tbl1.col1,	tbl1.col2

FROM	tbl1

#	column	labeling

>>>	print(select([t.c.col1.label('col_alias1')])

SELECT	tbl1.col1	as	"col_alias1"

FROM	tbl1

#	table	alias

>>>	t_A,	t_B	=	alias(t,	'A'),	alias(t,	'B')

>>>	print(select([t_A.c.col1,	t_B.c.col2]))

SELECT	"A".col1,	"B".col2

FROM	tbl1	AS	"A",	tbl1	AS	"B"
select() with table element
how	to	work	with

where	tbl1.col1	=	42
conditionals
how	to	work	with

where	tbl1.col1	=	42
conditionals
conditional expression
(compare operation)
>>>	cond	=	text('last_name	LIKE	%KOV')

>>>	str(cond)

'last_name	LIKE	%KOV'

conditional by text()
>>>	cond	=	column('last_name').like('%KOV')

>>>	cond

<sqlalchemy....BinaryExpression	object	at	...>

conditional by like() method
>>>	cond	=	column('last_name').like('%KOV')

>>>	cond

<sqlalchemy....BinaryExpression	object	at	...>

>>>	str(cond)

'last_name	LIKE	:last_name_1'

conditional by like() method
placeholder for
right value of LIKE
>>>	cond	=	column('last_name').like('%KOV')

>>>	cond

<sqlalchemy....BinaryExpression	object	at	...>

>>>	str(cond)

'last_name	LIKE	:last_name_1

>>>	cond.right

BindParameter('%(4339977744	last_name)s',	
'%KOV',	type_=String())

conditional by like() method
>>>	column('first_name')	=	'DAVID'

		File	"<stdin>",	line	1

SyntaxError:	can't	assign	to	function	call

conditional by operation
>>>	column('first_name')	=	'DAVID'

		File	"<stdin>",	line	1

SyntaxError:	can't	assign	to	function	call

>>>	column('first_name')	==	'DAVID'

<sqlalchemy...BinaryExpression	object	at	...>

conditional by operation
>>>	column('first_name')	=	'DAVID'

		File	"<stdin>",	line	1

SyntaxError:	can't	assign	to	function	call

>>>	column('first_name')	==	'DAVID'

<sqlalchemy...BinaryExpression	object	at	...>

>>>	cond	=	column('first_name')	==	'DAVID'

>>>	str(cond)

>>>	'first_name	=	:first_name_1'

>>>	cond.right

>>>	BindParameter('%(...)s',	'DAVID',	type_=...)

conditional by operation
>>>	column('first_name')	=	'DAVID'

		File	"<stdin>",	line	1

SyntaxError:	can't	assign	to	function	call

>>>	column('first_name')	==	'DAVID'

<sqlalchemy...BinaryExpression	object	at	...>

>>>	cond	=	column('first_name')	==	'DAVID'

>>>	str(cond)

>>>	'first_name	=	:first_name_1'

>>>	cond.right

>>>	BindParameter('%(...)s',	'DAVID',	type_=...)

>>>	str(column('last_name')	==	None)

>>>	'last_name	is	NULL'
conditional by operation
>>>	from	sqlalchemy.sql	import	select,	table,	column

>>>	actor_tbl	=	table('actor',	column('actor_id'),

...					column('first_name'),	column('last_name'))

conditionals in select
>>>	from	sqlalchemy.sql	import	select,	table,	column

>>>	actor_tbl	=	table('actor',	column('actor_id'),

...					column('first_name'),	column('last_name'))

>>>	query	=	select([actor_tbl],

...					whereclause=(actor_tbl.c.last_name=='TRACY'))

conditionals in select
>>>	from	sqlalchemy.sql	import	select,	table,	column

>>>	actor_tbl	=	table('actor',	column('actor_id'),

...					column('first_name'),	column('last_name'))

>>>	query	=	select([actor_tbl],

...					whereclause=(actor_tbl.c.last_name=='TRACY'))

>>>	query

<sqlalchemy.....Select	at	...;	Select	object>

>>>	print(query)

SELECT	actor.first_name,	actor.last_name	

FROM	actor	

WHERE	actor.last_name	=	:last_name_1

>>>	query.compile().params

{'last_name_1':	'TRACY'}

conditionals in select
>>>	from	sqlalchemy.sql	import	select,	table,	column

>>>	actor_tbl	=	table('actor',	column('actor_id'),

...					column('first_name'),	column('last_name'))

>>>	query	=	select([actor_tbl],

...					whereclause=(actor_tbl.c.last_name=='TRACY'))

>>>	query

<sqlalchemy.....Select	at	...;	Select	object>

>>>	print(query)

SELECT	actor.actor_id,	actor.first_name,	actor.last_name	

FROM	actor	

WHERE	actor.last_name	=	:last_name_1

>>>	query.compile().params

{'last_name_1':	'TRACY'}

>>>	list(e.execute(query))

[(20,	'LUCILLE',	'TRACY'),	(117,	'RENEE',	'TRACY')]

conditionals in select
select(...)

			SELECT	...

select(...).select_from(...)

			SELECT	...	FROM	...

select(...).where(...)

			SELECT	...	WHERE	...

select(...).where(...).where(...)

			SELECT	...	WHERE	...	AND	...

select(...).where(...).order_by(...)

			SELECT	...	WHERE	...	ORDER	BY	...
generative method
actor_tbl.select()

				SELECT	...	FROM	actor

actor_tbl.select(actor_tbl.c.first_name='BEN')

				SELECT	...	FROM	actor	WHERE	first_name=...

generative method
HANDS ON: SQL expression
• define actor table with
table()/column()
• build query with sql
expression to search

actor having initial A.H. 

(result should include
actor_id)
Schema definition
how	to	CREATE	table
schema definition
how	to	CREATE	table

how	to	define	column	detail

how	to	define	constraints
schema definition
>>>	from	sqlalchemy	import	Column,	MetaData,	Table

>>>	user_table	=	Table(

...					'user',	MetaData(),

...					Column('id',	INTEGER,	primary_key=True),

...					Column('first_name',	VARCHAR(45)),

...					Column('last_name',	VARCHAR(45)))

>>>
defining table
>>>	from	sqlalchemy	import	Column,	MetaData,	Table

>>>	user_table	=	Table(

...					'user',	MetaData(),

...					Column('id',	INTEGER,	primary_key=True),

...					Column('first_name',	VARCHAR(45)),

...					Column('last_name',	VARCHAR(45)))

>>>	user_table

Table('user',	MetaData(bind=None),	Column...)

defining table
>>>	from	sqlalchemy	import	Column,	MetaData,	Table

>>>	user_table	=	Table(

...					'user',	MetaData(),

...					Column('id',	INTEGER,	primary_key=True),

...					Column('first_name',	VARCHAR(45)),

...					Column('last_name',	VARCHAR(45)))

>>>	user_table

Table('user',	MetaData(bind=None),	Column...)

#	CREATE	TABLE	by	crete()

>>>	user_table.create(bind=e)

#	DROP	TABLE	with	drop()

>>>	user_table.drop(bind=e)

defining table
Table/Column vs table/column
Visitable (base type)
ClauseElement
Selectable
FromClause
[ table() ]
ColumnElement
ColumnClause
[ column() ]
Column Table
SchemaItem
Table/Column vs table/column
Visitable (base type)
ClauseElement
Selectable
FromClause
[ table() ]
ColumnElement
ColumnClause
[ column() ]
Column Table
SchemaItem
Supprorts
same operation
HANDS ON: Schema definition
• define "user" table with
Table()/Column()
• create table with .create()
• insert records
• drop table with .drop()
name type options
id INTEGER primary_key
username
VARCHAR
(64)
nullable=False
email
VARCHAR

(128)
nullable=False
ORM basics
Object-Relational Mapping
• Map DB records to objects
• ActiveRecord pattern
• 1 table ~> 1 class, 1 record ~> 1 object
• FK reference -> reference to other object
• column -> property/attribute of object
ORM in SQLAlchemy
• mapper maps a table with Python class

mapped class will have instrumented attribute
• Session manipulates DB for you to retrieve / save
mapped objects
mapping
Table
Column foo
Column bar
Column baz
...
entity class
"mapped" entity class
instrumented foo
instrumented bar
instrumented baz
...
method qux
method quux
method qux
method quux
...
mapper
classic mapping
[new] declarative mapping
mapping patterns
>>>	from	sqlalchemy.orm	import	mapper

>>>	actor_tbl	=	Table(...)

>>>	class	Actor(object):	pass

>>>	mapper(Actor,	actor_tbl)

>>>	dir(Actor)

['__class__',	...	'_sa_class_manager',	
'actor_id',	'first_name',	'last_name']

>>>	Actor.actor_id

<...InstrumentedAttribute	object	at	...>

classic mapping
>>>	from	sqlalchemy.ext.declarative	import	
declarative_base

>>>	from	sqlalchmy	import	DateTime,	Integer,	String

>>>	Base	=	declarative_base()

>>>

>>>	class	Actor(Base):

...					__tablename__	=	'actor'

...					actor_id	=	Column(Integer,	primary_key=True)

...					first_name	=	Column(String)

...					last_name	=	Column(String)

...					last_update	=	Column(DateTime)

declarative mapping
>>>	from	sqlalchemy.ext.declarative	import	declarative_base

>>>	from	sqlalchmy	import	DateTime,	Integer,	String

>>>	Base	=	declarative_base()

>>>

>>>	class	Actor(Base):

...					__tablename__	=	'actor'

...					actor_id	=	Column(Integer,	primary_key=True)

...					first_name	=	Column(String)

...					last_name	=	Column(String)

...					last_update	=	Column(DateTime)

>>>	dir(Actor)

['__class__',	'_decl_class_registry',	'_sa_class_manager',	
'actor_id',	'first_name',	'last_name',	'last_update',	
'metadata']

declarative mapping
ORM in SQLAlchemy
• mapper maps a table with Python class

mapped class will have instrumented attribute
• Session manipulates DB for you to retrieve / save
mapped objects
session
Engine
Program
query A
select A
record Aobject B
start

tracking A...
(updates) flag A as
"dirty"
reflect new/dirty
changes
flush
start

tracking B
...
add
object B
update A
insert B
commit
begin
Using Session
>>>	from	sqlalchemy.orm	import	sessionmaker

>>>	Session	=	sessionmaker(bind=e)

>>>	session	=	Session()

>>>

>>>
Using Session
>>>	from	sqlalchemy.orm	import	sessionmaker

>>>	Session	=	sessionmaker(bind=e)

>>>	session	=	Session()

>>>	query	=	session.query(Actor)

>>>	query

<sqlalchemy.orm.query.Query	object	at	...>
Using Session
>>>	from	sqlalchemy.orm	import	sessionmaker

>>>	Session	=	sessionmaker(bind=e)

>>>	session	=	Session()

>>>	query	=	session.query(Actor)

>>>	query

<sqlalchemy.orm.query.Query	object	at	...>

>>>	actor	=	query.first()

>>>	actor

<...Actor	Object	at	...>
Query object methods:
query filtering
>>>	q	=	session.query(Actor)

>>>	str(q)

>>>	'SELECT	...	nFROM	actor'

>>>	q1	=	q.filter(Actor.first_name=='BEN')

>>>	str(q1)

'SELECT	...	nFROM	actornWHERE	actor.first_name	=	?'

>>>	q2	=	q1.filter_by(last_name='SMITH')

>>>	str(q2)

'SELECT	...	nFROM	actornWHERE	actor.first_name	=	?	
AND	actor.last_name=	?'
Query object methods:
fetching record(s)
>>>	q	=	session.query(Actor)

>>>	q.first()

<...Actor	object	at	...>

>>>	q.all()		#	WARNING:	SELECTs	all	records

<...Actor	object	at	...>,	<...Actor	object	at	...>,	...

>>>	q[:3]

<...Actor	object	at	...>,	<...Actor	object	at	...>,	...

>>>	q.count()

200
Update/Insert in Session
>>>	session	=	Session()

>>>	actor_a	=	Actor(first_name='KEN',

...					last_name='WATANABE')

>>>	session.add(actor_a)

>>>	session.commit()

>>>	actor_b	=	session.query(Actor).get(1)

>>>	actor_b.last_name='GEORGE'

>>>	session.commit()
HANDS ON: ORM basics
• define Category model with
declarative ORM
• select any record
• add "Nature" category
• delete "Nature" category

More Related Content

What's hot

[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL TuningPgDay.Seoul
 
jQuery Tutorial For Beginners | Developing User Interface (UI) Using jQuery |...
jQuery Tutorial For Beginners | Developing User Interface (UI) Using jQuery |...jQuery Tutorial For Beginners | Developing User Interface (UI) Using jQuery |...
jQuery Tutorial For Beginners | Developing User Interface (UI) Using jQuery |...Edureka!
 
twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC
 
Oracle Latch and Mutex Contention Troubleshooting
Oracle Latch and Mutex Contention TroubleshootingOracle Latch and Mutex Contention Troubleshooting
Oracle Latch and Mutex Contention TroubleshootingTanel Poder
 
PostgreSQL 공간관리 살펴보기 이근오
PostgreSQL 공간관리 살펴보기 이근오PostgreSQL 공간관리 살펴보기 이근오
PostgreSQL 공간관리 살펴보기 이근오PgDay.Seoul
 
Low Level CPU Performance Profiling Examples
Low Level CPU Performance Profiling ExamplesLow Level CPU Performance Profiling Examples
Low Level CPU Performance Profiling ExamplesTanel Poder
 
jemalloc 세미나
jemalloc 세미나jemalloc 세미나
jemalloc 세미나Jang Hoon
 
Discover Quarkus and GraalVM
Discover Quarkus and GraalVMDiscover Quarkus and GraalVM
Discover Quarkus and GraalVMRomain Schlick
 
ClickHouse in Real Life. Case Studies and Best Practices, by Alexander Zaitsev
ClickHouse in Real Life. Case Studies and Best Practices, by Alexander ZaitsevClickHouse in Real Life. Case Studies and Best Practices, by Alexander Zaitsev
ClickHouse in Real Life. Case Studies and Best Practices, by Alexander ZaitsevAltinity Ltd
 
java.io - streams and files
java.io - streams and filesjava.io - streams and files
java.io - streams and filesMarcello Thiry
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Alexey Lesovsky
 
Introduction to kotlin coroutines
Introduction to kotlin coroutinesIntroduction to kotlin coroutines
Introduction to kotlin coroutinesNAVER Engineering
 
Java MySQL Connector & Connection Pool Features & Optimization
Java MySQL Connector & Connection Pool Features & OptimizationJava MySQL Connector & Connection Pool Features & Optimization
Java MySQL Connector & Connection Pool Features & OptimizationKenny Gryp
 
Performance Tuning - Memory leaks, Thread deadlocks, JDK tools
Performance Tuning -  Memory leaks, Thread deadlocks, JDK toolsPerformance Tuning -  Memory leaks, Thread deadlocks, JDK tools
Performance Tuning - Memory leaks, Thread deadlocks, JDK toolsHaribabu Nandyal Padmanaban
 

What's hot (20)

[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning
 
jQuery Tutorial For Beginners | Developing User Interface (UI) Using jQuery |...
jQuery Tutorial For Beginners | Developing User Interface (UI) Using jQuery |...jQuery Tutorial For Beginners | Developing User Interface (UI) Using jQuery |...
jQuery Tutorial For Beginners | Developing User Interface (UI) Using jQuery |...
 
twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧
 
jQuery for beginners
jQuery for beginnersjQuery for beginners
jQuery for beginners
 
Oracle Latch and Mutex Contention Troubleshooting
Oracle Latch and Mutex Contention TroubleshootingOracle Latch and Mutex Contention Troubleshooting
Oracle Latch and Mutex Contention Troubleshooting
 
PostgreSQL 공간관리 살펴보기 이근오
PostgreSQL 공간관리 살펴보기 이근오PostgreSQL 공간관리 살펴보기 이근오
PostgreSQL 공간관리 살펴보기 이근오
 
Get to know PostgreSQL!
Get to know PostgreSQL!Get to know PostgreSQL!
Get to know PostgreSQL!
 
Nouveautés Java 9-10-11
Nouveautés Java 9-10-11Nouveautés Java 9-10-11
Nouveautés Java 9-10-11
 
Getting started with entity framework
Getting started with entity framework Getting started with entity framework
Getting started with entity framework
 
Low Level CPU Performance Profiling Examples
Low Level CPU Performance Profiling ExamplesLow Level CPU Performance Profiling Examples
Low Level CPU Performance Profiling Examples
 
jQuery Ajax
jQuery AjaxjQuery Ajax
jQuery Ajax
 
jemalloc 세미나
jemalloc 세미나jemalloc 세미나
jemalloc 세미나
 
Discover Quarkus and GraalVM
Discover Quarkus and GraalVMDiscover Quarkus and GraalVM
Discover Quarkus and GraalVM
 
ClickHouse in Real Life. Case Studies and Best Practices, by Alexander Zaitsev
ClickHouse in Real Life. Case Studies and Best Practices, by Alexander ZaitsevClickHouse in Real Life. Case Studies and Best Practices, by Alexander Zaitsev
ClickHouse in Real Life. Case Studies and Best Practices, by Alexander Zaitsev
 
java.io - streams and files
java.io - streams and filesjava.io - streams and files
java.io - streams and files
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.
 
Introduction to kotlin coroutines
Introduction to kotlin coroutinesIntroduction to kotlin coroutines
Introduction to kotlin coroutines
 
Java MySQL Connector & Connection Pool Features & Optimization
Java MySQL Connector & Connection Pool Features & OptimizationJava MySQL Connector & Connection Pool Features & Optimization
Java MySQL Connector & Connection Pool Features & Optimization
 
jQuery
jQueryjQuery
jQuery
 
Performance Tuning - Memory leaks, Thread deadlocks, JDK tools
Performance Tuning -  Memory leaks, Thread deadlocks, JDK toolsPerformance Tuning -  Memory leaks, Thread deadlocks, JDK tools
Performance Tuning - Memory leaks, Thread deadlocks, JDK tools
 

Similar to SQLAlchemy Primer

Extending Oracle E-Business Suite with Ruby on Rails
Extending Oracle E-Business Suite with Ruby on RailsExtending Oracle E-Business Suite with Ruby on Rails
Extending Oracle E-Business Suite with Ruby on RailsRaimonds Simanovskis
 
ASP.NET MVC Performance
ASP.NET MVC PerformanceASP.NET MVC Performance
ASP.NET MVC Performancerudib
 
Power BI with Essbase in the Oracle Cloud
Power BI with Essbase in the Oracle CloudPower BI with Essbase in the Oracle Cloud
Power BI with Essbase in the Oracle CloudKellyn Pot'Vin-Gorman
 
EJB 3.0 Java Persistence with Oracle TopLink
EJB 3.0 Java Persistence with Oracle TopLinkEJB 3.0 Java Persistence with Oracle TopLink
EJB 3.0 Java Persistence with Oracle TopLinkBill Lyons
 
Intro to Rails Give Camp Atlanta
Intro to Rails Give Camp AtlantaIntro to Rails Give Camp Atlanta
Intro to Rails Give Camp AtlantaJason Noble
 
Spark + AI Summit 2020 イベント概要
Spark + AI Summit 2020 イベント概要Spark + AI Summit 2020 イベント概要
Spark + AI Summit 2020 イベント概要Paulo Gutierrez
 
Intro To Spring Python
Intro To Spring PythonIntro To Spring Python
Intro To Spring Pythongturnquist
 
Play framework productivity formula
Play framework   productivity formula Play framework   productivity formula
Play framework productivity formula Sorin Chiprian
 
Productionizing Machine Learning - Bigdata meetup 5-06-2019
Productionizing Machine Learning - Bigdata meetup 5-06-2019Productionizing Machine Learning - Bigdata meetup 5-06-2019
Productionizing Machine Learning - Bigdata meetup 5-06-2019Iulian Pintoiu
 
pandas.(to/from)_sql is simple but not fast
pandas.(to/from)_sql is simple but not fastpandas.(to/from)_sql is simple but not fast
pandas.(to/from)_sql is simple but not fastUwe Korn
 
Generating Code with Oracle SQL Developer Data Modeler
Generating Code with Oracle SQL Developer Data ModelerGenerating Code with Oracle SQL Developer Data Modeler
Generating Code with Oracle SQL Developer Data ModelerRob van den Berg
 
Optimize SQL server performance for SharePoint
Optimize SQL server performance for SharePointOptimize SQL server performance for SharePoint
Optimize SQL server performance for SharePointserge luca
 
Tuning SQL Server for Sharepoint 2013- What every sharepoint consultant need...
Tuning SQL Server for Sharepoint 2013-  What every sharepoint consultant need...Tuning SQL Server for Sharepoint 2013-  What every sharepoint consultant need...
Tuning SQL Server for Sharepoint 2013- What every sharepoint consultant need...serge luca
 
Robot Framework Introduction & Sauce Labs Integration
Robot Framework Introduction & Sauce Labs IntegrationRobot Framework Introduction & Sauce Labs Integration
Robot Framework Introduction & Sauce Labs IntegrationSauce Labs
 
Unlocking the power of the APEX Plugin Architecture
Unlocking the power of the APEX Plugin ArchitectureUnlocking the power of the APEX Plugin Architecture
Unlocking the power of the APEX Plugin ArchitectureMatt Nolan
 
Windows Server AppFabric Caching - What it is & when you should use it?
Windows Server AppFabric Caching - What it is & when you should use it?Windows Server AppFabric Caching - What it is & when you should use it?
Windows Server AppFabric Caching - What it is & when you should use it?Robert MacLean
 
web2py:Web development like a boss
web2py:Web development like a bossweb2py:Web development like a boss
web2py:Web development like a bossFrancisco Ribeiro
 
Play Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and ScalaPlay Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and ScalaYevgeniy Brikman
 

Similar to SQLAlchemy Primer (20)

Extending Oracle E-Business Suite with Ruby on Rails
Extending Oracle E-Business Suite with Ruby on RailsExtending Oracle E-Business Suite with Ruby on Rails
Extending Oracle E-Business Suite with Ruby on Rails
 
ASP.NET MVC Performance
ASP.NET MVC PerformanceASP.NET MVC Performance
ASP.NET MVC Performance
 
Power BI with Essbase in the Oracle Cloud
Power BI with Essbase in the Oracle CloudPower BI with Essbase in the Oracle Cloud
Power BI with Essbase in the Oracle Cloud
 
EJB 3.0 Java Persistence with Oracle TopLink
EJB 3.0 Java Persistence with Oracle TopLinkEJB 3.0 Java Persistence with Oracle TopLink
EJB 3.0 Java Persistence with Oracle TopLink
 
Intro to Rails Give Camp Atlanta
Intro to Rails Give Camp AtlantaIntro to Rails Give Camp Atlanta
Intro to Rails Give Camp Atlanta
 
Spark + AI Summit 2020 イベント概要
Spark + AI Summit 2020 イベント概要Spark + AI Summit 2020 イベント概要
Spark + AI Summit 2020 イベント概要
 
Intro To Spring Python
Intro To Spring PythonIntro To Spring Python
Intro To Spring Python
 
Play framework productivity formula
Play framework   productivity formula Play framework   productivity formula
Play framework productivity formula
 
Productionizing Machine Learning - Bigdata meetup 5-06-2019
Productionizing Machine Learning - Bigdata meetup 5-06-2019Productionizing Machine Learning - Bigdata meetup 5-06-2019
Productionizing Machine Learning - Bigdata meetup 5-06-2019
 
pandas.(to/from)_sql is simple but not fast
pandas.(to/from)_sql is simple but not fastpandas.(to/from)_sql is simple but not fast
pandas.(to/from)_sql is simple but not fast
 
Generating Code with Oracle SQL Developer Data Modeler
Generating Code with Oracle SQL Developer Data ModelerGenerating Code with Oracle SQL Developer Data Modeler
Generating Code with Oracle SQL Developer Data Modeler
 
Optimize SQL server performance for SharePoint
Optimize SQL server performance for SharePointOptimize SQL server performance for SharePoint
Optimize SQL server performance for SharePoint
 
Tuning SQL Server for Sharepoint 2013- What every sharepoint consultant need...
Tuning SQL Server for Sharepoint 2013-  What every sharepoint consultant need...Tuning SQL Server for Sharepoint 2013-  What every sharepoint consultant need...
Tuning SQL Server for Sharepoint 2013- What every sharepoint consultant need...
 
Robot Framework Introduction & Sauce Labs Integration
Robot Framework Introduction & Sauce Labs IntegrationRobot Framework Introduction & Sauce Labs Integration
Robot Framework Introduction & Sauce Labs Integration
 
Unlocking the power of the APEX Plugin Architecture
Unlocking the power of the APEX Plugin ArchitectureUnlocking the power of the APEX Plugin Architecture
Unlocking the power of the APEX Plugin Architecture
 
Wider than rails
Wider than railsWider than rails
Wider than rails
 
Windows Server AppFabric Caching - What it is & when you should use it?
Windows Server AppFabric Caching - What it is & when you should use it?Windows Server AppFabric Caching - What it is & when you should use it?
Windows Server AppFabric Caching - What it is & when you should use it?
 
web2py:Web development like a boss
web2py:Web development like a bossweb2py:Web development like a boss
web2py:Web development like a boss
 
PPT
PPTPPT
PPT
 
Play Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and ScalaPlay Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and Scala
 

More from 泰 増田

PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
 
Taming robotframework
Taming robotframeworkTaming robotframework
Taming robotframework泰 増田
 
Open bio2004 biopython
Open bio2004 biopythonOpen bio2004 biopython
Open bio2004 biopython泰 増田
 
Python languageupdate (2004)
Python languageupdate (2004)Python languageupdate (2004)
Python languageupdate (2004)泰 増田
 
Robot Framework (のSelenium2Libraryのお話)
Robot Framework (のSelenium2Libraryのお話)Robot Framework (のSelenium2Libraryのお話)
Robot Framework (のSelenium2Libraryのお話)泰 増田
 
wxPython入門(大阪Pythonユーザの集まり2014/03)
wxPython入門(大阪Pythonユーザの集まり2014/03)wxPython入門(大阪Pythonユーザの集まり2014/03)
wxPython入門(大阪Pythonユーザの集まり2014/03)泰 増田
 

More from 泰 増田 (7)

PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
Taming robotframework
Taming robotframeworkTaming robotframework
Taming robotframework
 
Open bio2004 biopython
Open bio2004 biopythonOpen bio2004 biopython
Open bio2004 biopython
 
Python languageupdate (2004)
Python languageupdate (2004)Python languageupdate (2004)
Python languageupdate (2004)
 
Robot Framework (のSelenium2Libraryのお話)
Robot Framework (のSelenium2Libraryのお話)Robot Framework (のSelenium2Libraryのお話)
Robot Framework (のSelenium2Libraryのお話)
 
Django boodoo
Django boodooDjango boodoo
Django boodoo
 
wxPython入門(大阪Pythonユーザの集まり2014/03)
wxPython入門(大阪Pythonユーザの集まり2014/03)wxPython入門(大阪Pythonユーザの集まり2014/03)
wxPython入門(大阪Pythonユーザの集まり2014/03)
 

Recently uploaded

An experimental study in using natural admixture as an alternative for chemic...
An experimental study in using natural admixture as an alternative for chemic...An experimental study in using natural admixture as an alternative for chemic...
An experimental study in using natural admixture as an alternative for chemic...Chandu841456
 
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptxDecoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptxJoão Esperancinha
 
Instrumentation, measurement and control of bio process parameters ( Temperat...
Instrumentation, measurement and control of bio process parameters ( Temperat...Instrumentation, measurement and control of bio process parameters ( Temperat...
Instrumentation, measurement and control of bio process parameters ( Temperat...121011101441
 
Software and Systems Engineering Standards: Verification and Validation of Sy...
Software and Systems Engineering Standards: Verification and Validation of Sy...Software and Systems Engineering Standards: Verification and Validation of Sy...
Software and Systems Engineering Standards: Verification and Validation of Sy...VICTOR MAESTRE RAMIREZ
 
Concrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptxConcrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptxKartikeyaDwivedi3
 
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdf
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdfCCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdf
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdfAsst.prof M.Gokilavani
 
Call Us ≽ 8377877756 ≼ Call Girls In Shastri Nagar (Delhi)
Call Us ≽ 8377877756 ≼ Call Girls In Shastri Nagar (Delhi)Call Us ≽ 8377877756 ≼ Call Girls In Shastri Nagar (Delhi)
Call Us ≽ 8377877756 ≼ Call Girls In Shastri Nagar (Delhi)dollysharma2066
 
Work Experience-Dalton Park.pptxfvvvvvvv
Work Experience-Dalton Park.pptxfvvvvvvvWork Experience-Dalton Park.pptxfvvvvvvv
Work Experience-Dalton Park.pptxfvvvvvvvLewisJB
 
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdf
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdfCCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdf
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdfAsst.prof M.Gokilavani
 
Architect Hassan Khalil Portfolio for 2024
Architect Hassan Khalil Portfolio for 2024Architect Hassan Khalil Portfolio for 2024
Architect Hassan Khalil Portfolio for 2024hassan khalil
 
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor CatchersTechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catcherssdickerson1
 
Risk Assessment For Installation of Drainage Pipes.pdf
Risk Assessment For Installation of Drainage Pipes.pdfRisk Assessment For Installation of Drainage Pipes.pdf
Risk Assessment For Installation of Drainage Pipes.pdfROCENODodongVILLACER
 
Artificial-Intelligence-in-Electronics (K).pptx
Artificial-Intelligence-in-Electronics (K).pptxArtificial-Intelligence-in-Electronics (K).pptx
Artificial-Intelligence-in-Electronics (K).pptxbritheesh05
 
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...srsj9000
 
main PPT.pptx of girls hostel security using rfid
main PPT.pptx of girls hostel security using rfidmain PPT.pptx of girls hostel security using rfid
main PPT.pptx of girls hostel security using rfidNikhilNagaraju
 
complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...asadnawaz62
 
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort serviceGurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort servicejennyeacort
 

Recently uploaded (20)

Call Us -/9953056974- Call Girls In Vikaspuri-/- Delhi NCR
Call Us -/9953056974- Call Girls In Vikaspuri-/- Delhi NCRCall Us -/9953056974- Call Girls In Vikaspuri-/- Delhi NCR
Call Us -/9953056974- Call Girls In Vikaspuri-/- Delhi NCR
 
An experimental study in using natural admixture as an alternative for chemic...
An experimental study in using natural admixture as an alternative for chemic...An experimental study in using natural admixture as an alternative for chemic...
An experimental study in using natural admixture as an alternative for chemic...
 
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptxDecoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
 
Instrumentation, measurement and control of bio process parameters ( Temperat...
Instrumentation, measurement and control of bio process parameters ( Temperat...Instrumentation, measurement and control of bio process parameters ( Temperat...
Instrumentation, measurement and control of bio process parameters ( Temperat...
 
Software and Systems Engineering Standards: Verification and Validation of Sy...
Software and Systems Engineering Standards: Verification and Validation of Sy...Software and Systems Engineering Standards: Verification and Validation of Sy...
Software and Systems Engineering Standards: Verification and Validation of Sy...
 
Concrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptxConcrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptx
 
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdf
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdfCCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdf
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdf
 
Call Us ≽ 8377877756 ≼ Call Girls In Shastri Nagar (Delhi)
Call Us ≽ 8377877756 ≼ Call Girls In Shastri Nagar (Delhi)Call Us ≽ 8377877756 ≼ Call Girls In Shastri Nagar (Delhi)
Call Us ≽ 8377877756 ≼ Call Girls In Shastri Nagar (Delhi)
 
Work Experience-Dalton Park.pptxfvvvvvvv
Work Experience-Dalton Park.pptxfvvvvvvvWork Experience-Dalton Park.pptxfvvvvvvv
Work Experience-Dalton Park.pptxfvvvvvvv
 
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdf
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdfCCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdf
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdf
 
young call girls in Green Park🔝 9953056974 🔝 escort Service
young call girls in Green Park🔝 9953056974 🔝 escort Serviceyoung call girls in Green Park🔝 9953056974 🔝 escort Service
young call girls in Green Park🔝 9953056974 🔝 escort Service
 
Architect Hassan Khalil Portfolio for 2024
Architect Hassan Khalil Portfolio for 2024Architect Hassan Khalil Portfolio for 2024
Architect Hassan Khalil Portfolio for 2024
 
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor CatchersTechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
 
Risk Assessment For Installation of Drainage Pipes.pdf
Risk Assessment For Installation of Drainage Pipes.pdfRisk Assessment For Installation of Drainage Pipes.pdf
Risk Assessment For Installation of Drainage Pipes.pdf
 
Artificial-Intelligence-in-Electronics (K).pptx
Artificial-Intelligence-in-Electronics (K).pptxArtificial-Intelligence-in-Electronics (K).pptx
Artificial-Intelligence-in-Electronics (K).pptx
 
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
 
Exploring_Network_Security_with_JA3_by_Rakesh Seal.pptx
Exploring_Network_Security_with_JA3_by_Rakesh Seal.pptxExploring_Network_Security_with_JA3_by_Rakesh Seal.pptx
Exploring_Network_Security_with_JA3_by_Rakesh Seal.pptx
 
main PPT.pptx of girls hostel security using rfid
main PPT.pptx of girls hostel security using rfidmain PPT.pptx of girls hostel security using rfid
main PPT.pptx of girls hostel security using rfid
 
complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...
 
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort serviceGurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
 

SQLAlchemy Primer