This section discusses the fundamental Table
, Column
and MetaData
objects.
A collection of metadata entities is stored in an object aptly named
MetaData
:
from sqlalchemy import *
metadata = MetaData()
MetaData
is a container object that keeps together
many different features of a database (or multiple databases) being described.
To represent a table, use the Table
class. Its two
primary arguments are the table name, then the
MetaData
object which it will be associated with.
The remaining positional arguments are mostly
Column
objects describing each column:
user = Table('user', metadata,
Column('user_id', Integer, primary_key=True),
Column('user_name', String(16), nullable=False),
Column('email_address', String(60)),
Column('nickname', String(50), nullable=False)
)
Above, a table called user
is described, which contains four columns. The
primary key of the table consists of the user_id
column. Multiple columns
may be assigned the primary_key=True
flag which denotes a multi-column
primary key, known as a composite primary key.
Note also that each column describes its datatype using objects corresponding
to genericized types, such as Integer
and
String
. SQLAlchemy features dozens of types of
varying levels of specificity as well as the ability to create custom types.
Documentation on the type system can be found at Column and Data Types.
The MetaData
object contains all of the schema
constructs we’ve associated with it. It supports a few methods of accessing
these table objects, such as the sorted_tables
accessor which returns a
list of each Table
object in order of foreign key
dependency (that is, each table is preceded by all tables which it
references):
>>> for t in metadata.sorted_tables:
... print(t.name)
user
user_preference
invoice
invoice_item
In most cases, individual Table
objects have been
explicitly declared, and these objects are typically accessed directly as
module-level variables in an application. Once a
Table
has been defined, it has a full set of
accessors which allow inspection of its properties. Given the following
Table
definition:
employees = Table('employees', metadata,
Column('employee_id', Integer, primary_key=True),
Column('employee_name', String(60), nullable=False),
Column('employee_dept', Integer, ForeignKey("departments.department_id"))
)
Note the ForeignKey
object used in this table -
this construct defines a reference to a remote table, and is fully described
in Defining Foreign Keys. Methods of accessing information about this
table include:
# access the column "EMPLOYEE_ID":
employees.columns.employee_id
# or just
employees.c.employee_id
# via string
employees.c['employee_id']
# iterate through all columns
for c in employees.c:
print(c)
# get the table's primary key columns
for primary_key in employees.primary_key:
print(primary_key)
# get the table's foreign key objects:
for fkey in employees.foreign_keys:
print(fkey)
# access the table's MetaData:
employees.metadata
# access the table's bound Engine or Connection, if its MetaData is bound:
employees.bind
# access a column's name, type, nullable, primary key, foreign key
employees.c.employee_id.name
employees.c.employee_id.type
employees.c.employee_id.nullable
employees.c.employee_id.primary_key
employees.c.employee_dept.foreign_keys
# get the "key" of a column, which defaults to its name, but can
# be any user-defined string:
employees.c.employee_name.key
# access a column's table:
employees.c.employee_id.table is employees
# get the table related by a foreign key
list(employees.c.employee_dept.foreign_keys)[0].column.table
Once you’ve defined some Table
objects, assuming
you’re working with a brand new database one thing you might want to do is
issue CREATE statements for those tables and their related constructs (as an
aside, it’s also quite possible that you don’t want to do this, if you
already have some preferred methodology such as tools included with your
database or an existing scripting system - if that’s the case, feel free to
skip this section - SQLAlchemy has no requirement that it be used to create
your tables).
The usual way to issue CREATE is to use
create_all()
on the
MetaData
object. This method will issue queries
that first check for the existence of each individual table, and if not found
will issue the CREATE statements:
engine = create_engine('sqlite:///:memory:') metadata = MetaData() user = Table('user', metadata, Column('user_id', Integer, primary_key=True), Column('user_name', String(16), nullable=False), Column('email_address', String(60), key='email'), Column('nickname', String(50), nullable=False) ) user_prefs = Table('user_prefs', metadata, Column('pref_id', Integer, primary_key=True), Column('user_id', Integer, ForeignKey("user.user_id"), nullable=False), Column('pref_name', String(40), nullable=False), Column('pref_value', String(100)) ) sqlmetadata.create_all(engine)PRAGMA table_info(user){} CREATE TABLE user( user_id INTEGER NOT NULL PRIMARY KEY, user_name VARCHAR(16) NOT NULL, email_address VARCHAR(60), nickname VARCHAR(50) NOT NULL ) PRAGMA table_info(user_prefs){} CREATE TABLE user_prefs( pref_id INTEGER NOT NULL PRIMARY KEY, user_id INTEGER NOT NULL REFERENCES user(user_id), pref_name VARCHAR(40) NOT NULL, pref_value VARCHAR(100) )
create_all()
creates foreign key constraints
between tables usually inline with the table definition itself, and for this
reason it also generates the tables in order of their dependency. There are
options to change this behavior such that ALTER TABLE
is used instead.
Dropping all tables is similarly achieved using the
drop_all()
method. This method does the
exact opposite of create_all()
- the
presence of each table is checked first, and tables are dropped in reverse
order of dependency.
Creating and dropping individual tables can be done via the create()
and
drop()
methods of Table
. These methods by
default issue the CREATE or DROP regardless of the table being present:
engine = create_engine('sqlite:///:memory:')
meta = MetaData()
employees = Table('employees', meta,
Column('employee_id', Integer, primary_key=True),
Column('employee_name', String(60), nullable=False, key='name'),
Column('employee_dept', Integer, ForeignKey("departments.department_id"))
)
sqlemployees.create(engine)
CREATE TABLE employees(
employee_id SERIAL NOT NULL PRIMARY KEY,
employee_name VARCHAR(60) NOT NULL,
employee_dept INTEGER REFERENCES departments(department_id)
)
{}
drop()
method:
sqlemployees.drop(engine)
DROP TABLE employees
{}
To enable the “check first for the table existing” logic, add the
checkfirst=True
argument to create()
or drop()
:
employees.create(engine, checkfirst=True)
employees.drop(engine, checkfirst=False)
While SQLAlchemy directly supports emitting CREATE and DROP statements for schema
constructs, the ability to alter those constructs, usually via the ALTER statement
as well as other database-specific constructs, is outside of the scope of SQLAlchemy
itself. While it’s easy enough to emit ALTER statements and similar by hand,
such as by passing a string to Connection.execute()
or by using the
DDL
construct, it’s a common practice to automate the maintenance of
database schemas in relation to application code using schema migration tools.
There are two major migration tools available for SQLAlchemy:
Some databases support the concept of multiple schemas. A
Table
can reference this by specifying the
schema
keyword argument:
financial_info = Table('financial_info', meta,
Column('id', Integer, primary_key=True),
Column('value', String(100), nullable=False),
schema='remote_banks'
)
Within the MetaData
collection, this table will be
identified by the combination of financial_info
and remote_banks
. If
another table called financial_info
is referenced without the
remote_banks
schema, it will refer to a different
Table
. ForeignKey
objects can specify references to columns in this table using the form
remote_banks.financial_info.id
.
The schema
argument should be used for any name qualifiers required,
including Oracle’s “owner” attribute and similar. It also can accommodate a
dotted name for longer schemes:
schema="dbo.scott"
Table
supports database-specific options. For
example, MySQL has different table backend types, including “MyISAM” and
“InnoDB”. This can be expressed with Table
using
mysql_engine
:
addresses = Table('engine_email_addresses', meta,
Column('address_id', Integer, primary_key=True),
Column('remote_user_id', Integer, ForeignKey(users.c.user_id)),
Column('email_address', String(20)),
mysql_engine='InnoDB'
)
Other backends may support table-level options as well - these would be described in the individual documentation sections for each dialect.
sqlalchemy.schema.
BLANK_SCHEMA
¶Symbol indicating that a Table
or Sequence
should have ‘None’ for its schema, even if the parent
MetaData
has specified a schema.
New in version 1.0.14.
sqlalchemy.schema.
Column
(*args, **kwargs)¶Bases: sqlalchemy.sql.base.DialectKWArgs
, sqlalchemy.schema.SchemaItem
, sqlalchemy.sql.expression.ColumnClause
Represents a column in a database table.
__eq__
(other)¶__eq__()
method of ColumnOperators
Implement the ==
operator.
In a column context, produces the clause a = b
.
If the target is None
, produces a IS NULL
.
__init__
(*args, **kwargs)¶Construct a new Column
object.
Parameters: |
|
---|
__le__
(other)¶__le__()
method of ColumnOperators
Implement the <=
operator.
In a column context, produces the clause a <= b
.
__lt__
(other)¶__lt__()
method of ColumnOperators
Implement the <
operator.
In a column context, produces the clause a < b
.
__ne__
(other)¶__ne__()
method of ColumnOperators
Implement the !=
operator.
In a column context, produces the clause a != b
.
If the target is None
, produces a IS NOT NULL
.
all_
()¶all_()
method of ColumnOperators
Produce a all_()
clause against the
parent object.
This operator is only appropriate against a scalar subquery object, or for some backends an column expression that is against the ARRAY type, e.g.:
# postgresql '5 = ALL (somearray)'
expr = 5 == mytable.c.somearray.all_()
# mysql '5 = ALL (SELECT value FROM table)'
expr = 5 == select([table.c.value]).as_scalar().all_()
New in version 1.1.
anon_label
¶anon_label
attribute of ColumnElement
provides a constant ‘anonymous label’ for this ColumnElement.
This is a label() expression which will be named at compile time. The same label() is returned each time anon_label is called so that expressions can reference anon_label multiple times, producing the same label name at compile time.
the compiler uses this function automatically at compile time for expressions that are known to be ‘unnamed’ like binary expressions and function calls.
any_
()¶any_()
method of ColumnOperators
Produce a any_()
clause against the
parent object.
This operator is only appropriate against a scalar subquery object, or for some backends an column expression that is against the ARRAY type, e.g.:
# postgresql '5 = ANY (somearray)'
expr = 5 == mytable.c.somearray.any_()
# mysql '5 = ANY (SELECT value FROM table)'
expr = 5 == select([table.c.value]).as_scalar().any_()
New in version 1.1.
argument_for
(dialect_name, argument_name, default)¶argument_for()
method of DialectKWArgs
Add a new kind of dialect-specific keyword argument for this class.
E.g.:
Index.argument_for("mydialect", "length", None)
some_index = Index('a', 'b', mydialect_length=5)
The DialectKWArgs.argument_for()
method is a per-argument
way adding extra arguments to the
DefaultDialect.construct_arguments
dictionary. This
dictionary provides a list of argument names accepted by various
schema-level constructs on behalf of a dialect.
New dialects should typically specify this dictionary all at once as a data member of the dialect class. The use case for ad-hoc addition of argument names is typically for end-user code that is also using a custom compilation scheme which consumes the additional arguments.
Parameters: |
|
---|
New in version 0.9.4.
asc
()¶asc()
method of ColumnOperators
Produce a asc()
clause against the
parent object.
between
(cleft, cright, symmetric=False)¶between()
method of ColumnOperators
Produce a between()
clause against
the parent object, given the lower and upper range.
bool_op
(opstring, precedence=0)¶Return a custom boolean operator.
This method is shorthand for calling
Operators.op()
and passing the
Operators.op.is_comparison
flag with True.
New in version 1.2.0b3.
See also
cast
(type_)¶cast()
method of ColumnElement
Produce a type cast, i.e. CAST(<expression> AS <type>)
.
This is a shortcut to the cast()
function.
New in version 1.0.7.
collate
(collation)¶collate()
method of ColumnOperators
Produce a collate()
clause against
the parent object, given the collation string.
See also
compare
(other, use_proxies=False, equivalents=None, **kw)¶compare()
method of ColumnElement
Compare this ColumnElement to another.
Special arguments understood:
Parameters: |
|
---|
compile
(default, bind=None, dialect=None, **kw)¶compile()
method of ClauseElement
Compile this SQL expression.
The return value is a Compiled
object.
Calling str()
or unicode()
on the returned value will yield a
string representation of the result. The
Compiled
object also can return a
dictionary of bind parameter names and values
using the params
accessor.
Parameters: |
|
---|
concat
(other)¶concat()
method of ColumnOperators
Implement the ‘concat’ operator.
In a column context, produces the clause a || b
,
or uses the concat()
operator on MySQL.
contains
(other, **kwargs)¶contains()
method of ColumnOperators
Implement the ‘contains’ operator.
Produces a LIKE expression that tests against a match for the middle of a string value:
column LIKE '%' || <other> || '%'
E.g.:
stmt = select([sometable]).\
where(sometable.c.column.contains("foobar"))
Since the operator uses LIKE
, wildcard characters
"%"
and "_"
that are present inside the <other> expression
will behave like wildcards as well. For literal string
values, the ColumnOperators.contains.autoescape
flag
may be set to True
to apply escaping to occurrences of these
characters within the string value so that they match as themselves
and not as wildcard characters. Alternatively, the
ColumnOperators.contains.escape
parameter will establish
a given character as an escape character which can be of use when
the target expression is not a literal string.
Parameters: |
|
---|
copy
(**kw)¶Create a copy of this Column
, uninitialized.
This is used in Table.tometadata
.
desc
()¶desc()
method of ColumnOperators
Produce a desc()
clause against the
parent object.
dialect_kwargs
¶dialect_kwargs
attribute of DialectKWArgs
A collection of keyword arguments specified as dialect-specific options to this construct.
The arguments are present here in their original <dialect>_<kwarg>
format. Only arguments that were actually passed are included;
unlike the DialectKWArgs.dialect_options
collection, which
contains all options known by this dialect including defaults.
The collection is also writable; keys are accepted of the
form <dialect>_<kwarg>
where the value will be assembled
into the list of options.
New in version 0.9.2.
Changed in version 0.9.4: The DialectKWArgs.dialect_kwargs
collection is now writable.
See also
DialectKWArgs.dialect_options
- nested dictionary form
dialect_options
¶dialect_options
attribute of DialectKWArgs
A collection of keyword arguments specified as dialect-specific options to this construct.
This is a two-level nested registry, keyed to <dialect_name>
and <argument_name>
. For example, the postgresql_where
argument would be locatable as:
arg = my_object.dialect_options['postgresql']['where']
New in version 0.9.2.
See also
DialectKWArgs.dialect_kwargs
- flat dictionary form
distinct
()¶distinct()
method of ColumnOperators
Produce a distinct()
clause against the
parent object.
endswith
(other, **kwargs)¶endswith()
method of ColumnOperators
Implement the ‘endswith’ operator.
Produces a LIKE expression that tests against a match for the end of a string value:
column LIKE '%' || <other>
E.g.:
stmt = select([sometable]).\
where(sometable.c.column.endswith("foobar"))
Since the operator uses LIKE
, wildcard characters
"%"
and "_"
that are present inside the <other> expression
will behave like wildcards as well. For literal string
values, the ColumnOperators.endswith.autoescape
flag
may be set to True
to apply escaping to occurrences of these
characters within the string value so that they match as themselves
and not as wildcard characters. Alternatively, the
ColumnOperators.endswith.escape
parameter will establish
a given character as an escape character which can be of use when
the target expression is not a literal string.
Parameters: |
|
---|
expression
¶expression
attribute of ColumnElement
Return a column expression.
Part of the inspection interface; returns self.
get_children
(schema_visitor=False, **kwargs)¶used to allow SchemaVisitor access
ilike
(other, escape=None)¶ilike()
method of ColumnOperators
Implement the ilike
operator, e.g. case insensitive LIKE.
In a column context, produces an expression either of the form:
lower(a) LIKE lower(other)
Or on backends that support the ILIKE operator:
a ILIKE other
E.g.:
stmt = select([sometable]).\
where(sometable.c.column.ilike("%foobar%"))
Parameters: |
---|
See also
in_
(other)¶in_()
method of ColumnOperators
Implement the in
operator.
In a column context, produces the clause column IN <other>
.
The given parameter other
may be:
A list of literal values, e.g.:
stmt.where(column.in_([1, 2, 3]))
In this calling form, the list of items is converted to a set of bound parameters the same length as the list given:
WHERE COL IN (?, ?, ?)
A list of tuples may be provided if the comparison is against a
tuple_()
containing multiple expressions:
from sqlalchemy import tuple_
stmt.where(tuple_(col1, col2).in_([(1, 10), (2, 20), (3, 30)]))
An empty list, e.g.:
stmt.where(column.in_([]))
In this calling form, the expression renders a “false” expression, e.g.:
WHERE 1 != 1
This “false” expression has historically had different behaviors
in older SQLAlchemy versions, see
create_engine.empty_in_strategy
for behavioral options.
Changed in version 1.2: simplified the behavior of “empty in” expressions
A bound parameter, e.g. bindparam()
, may be used if it
includes the bindparam.expanding
flag:
stmt.where(column.in_(bindparam('value', expanding=True)))
In this calling form, the expression renders a special non-SQL placeholder expression that looks like:
WHERE COL IN ([EXPANDING_value])
This placeholder expression is intercepted at statement execution time to be converted into the variable number of bound parameter form illustrated earlier. If the statement were executed as:
connection.execute(stmt, {"value": [1, 2, 3]})
The database would be passed a bound parameter for each value:
WHERE COL IN (?, ?, ?)
New in version 1.2: added “expanding” bound parameters
If an empty list is passed, a special “empty list” expression, which is specific to the database in use, is rendered. On SQLite this would be:
WHERE COL IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1)
New in version 1.3: “expanding” bound parameters now support empty lists
a select()
construct, which is usually a correlated
scalar select:
stmt.where(
column.in_(
select([othertable.c.y]).
where(table.c.x == othertable.c.x)
)
)
In this calling form, ColumnOperators.in_()
renders as given:
WHERE COL IN (SELECT othertable.y
FROM othertable WHERE othertable.x = table.x)
Parameters: | other¶ – a list of literals, a select() construct,
or a bindparam() construct that includes the
bindparam.expanding flag set to True. |
---|
info
¶info
attribute of SchemaItem
Info dictionary associated with the object, allowing user-defined
data to be associated with this SchemaItem
.
The dictionary is automatically generated when first accessed.
It can also be specified in the constructor of some objects,
such as Table
and Column
.
is_
(other)¶is_()
method of ColumnOperators
Implement the IS
operator.
Normally, IS
is generated automatically when comparing to a
value of None
, which resolves to NULL
. However, explicit
usage of IS
may be desirable if comparing to boolean values
on certain platforms.
See also
is_distinct_from
(other)¶is_distinct_from()
method of ColumnOperators
Implement the IS DISTINCT FROM
operator.
Renders “a IS DISTINCT FROM b” on most platforms; on some such as SQLite may render “a IS NOT b”.
New in version 1.1.
isnot
(other)¶isnot()
method of ColumnOperators
Implement the IS NOT
operator.
Normally, IS NOT
is generated automatically when comparing to a
value of None
, which resolves to NULL
. However, explicit
usage of IS NOT
may be desirable if comparing to boolean values
on certain platforms.
See also
isnot_distinct_from
(other)¶isnot_distinct_from()
method of ColumnOperators
Implement the IS NOT DISTINCT FROM
operator.
Renders “a IS NOT DISTINCT FROM b” on most platforms; on some such as SQLite may render “a IS b”.
New in version 1.1.
kwargs
¶kwargs
attribute of DialectKWArgs
A synonym for DialectKWArgs.dialect_kwargs
.
label
(name)¶label()
method of ColumnElement
Produce a column label, i.e. <columnname> AS <name>
.
This is a shortcut to the label()
function.
if ‘name’ is None, an anonymous label name will be generated.
like
(other, escape=None)¶like()
method of ColumnOperators
Implement the like
operator.
In a column context, produces the expression:
a LIKE other
E.g.:
stmt = select([sometable]).\
where(sometable.c.column.like("%foobar%"))
Parameters: |
---|
See also
match
(other, **kwargs)¶match()
method of ColumnOperators
Implements a database-specific ‘match’ operator.
match()
attempts to resolve to
a MATCH-like function or operator provided by the backend.
Examples include:
x @@ to_tsquery(y)
MATCH (x) AGAINST (y IN BOOLEAN MODE)
CONTAINS(x, y)
notilike
(other, escape=None)¶notilike()
method of ColumnOperators
implement the NOT ILIKE
operator.
This is equivalent to using negation with
ColumnOperators.ilike()
, i.e. ~x.ilike(y)
.
See also
notin_
(other)¶notin_()
method of ColumnOperators
implement the NOT IN
operator.
This is equivalent to using negation with
ColumnOperators.in_()
, i.e. ~x.in_(y)
.
In the case that other
is an empty sequence, the compiler
produces an “empty not in” expression. This defaults to the
expression “1 = 1” to produce true in all cases. The
create_engine.empty_in_strategy
may be used to
alter this behavior.
Changed in version 1.2: The ColumnOperators.in_()
and
ColumnOperators.notin_()
operators
now produce a “static” expression for an empty IN sequence
by default.
See also
notlike
(other, escape=None)¶notlike()
method of ColumnOperators
implement the NOT LIKE
operator.
This is equivalent to using negation with
ColumnOperators.like()
, i.e. ~x.like(y)
.
See also
nullsfirst
()¶nullsfirst()
method of ColumnOperators
Produce a nullsfirst()
clause against the
parent object.
nullslast
()¶nullslast()
method of ColumnOperators
Produce a nullslast()
clause against the
parent object.
op
(opstring, precedence=0, is_comparison=False, return_type=None)¶produce a generic operator function.
e.g.:
somecolumn.op("*")(5)
produces:
somecolumn * 5
This function can also be used to make bitwise operators explicit. For example:
somecolumn.op('&')(0xff)
is a bitwise AND of the value in somecolumn
.
Parameters: |
|
---|
operate
(op, *other, **kwargs)¶operate()
method of ColumnElement
Operate on an argument.
This is the lowest level of operation, raises
NotImplementedError
by default.
Overriding this on a subclass can allow common
behavior to be applied to all operations.
For example, overriding ColumnOperators
to apply func.lower()
to the left and right
side:
class MyComparator(ColumnOperators):
def operate(self, op, other):
return op(func.lower(self), func.lower(other))
Parameters: |
---|
quote
¶quote
attribute of SchemaItem
Return the value of the quote
flag passed
to this schema object, for those schema items which
have a name
field.
Deprecated since version 0.9: The SchemaItem.quote
attribute is deprecated and will be removed in a future release. Use the quoted_name.quote
attribute on the name
field of the target schema item to retrievequoted status.
references
(column)¶Return True if this Column references the given column via foreign key.
reverse_operate
(op, other, **kwargs)¶reverse_operate()
method of ColumnElement
Reverse operate on an argument.
Usage is the same as operate()
.
self_group
(against=None)¶self_group()
method of ColumnElement
Apply a ‘grouping’ to this ClauseElement
.
This method is overridden by subclasses to return a
“grouping” construct, i.e. parenthesis. In particular
it’s used by “binary” expressions to provide a grouping
around themselves when placed into a larger expression,
as well as by select()
constructs when placed into
the FROM clause of another select()
. (Note that
subqueries should be normally created using the
Select.alias()
method, as many platforms require
nested SELECT statements to be named).
As expressions are composed together, the application of
self_group()
is automatic - end-user code should never
need to use this method directly. Note that SQLAlchemy’s
clause constructs take operator precedence into account -
so parenthesis might not be needed, for example, in
an expression like x OR (y AND z)
- AND takes precedence
over OR.
The base self_group()
method of ClauseElement
just returns self.
shares_lineage
(othercolumn)¶shares_lineage()
method of ColumnElement
Return True if the given ColumnElement
has a common ancestor to this ColumnElement
.
startswith
(other, **kwargs)¶startswith()
method of ColumnOperators
Implement the startswith
operator.
Produces a LIKE expression that tests against a match for the start of a string value:
column LIKE <other> || '%'
E.g.:
stmt = select([sometable]).\
where(sometable.c.column.startswith("foobar"))
Since the operator uses LIKE
, wildcard characters
"%"
and "_"
that are present inside the <other> expression
will behave like wildcards as well. For literal string
values, the ColumnOperators.startswith.autoescape
flag
may be set to True
to apply escaping to occurrences of these
characters within the string value so that they match as themselves
and not as wildcard characters. Alternatively, the
ColumnOperators.startswith.escape
parameter will establish
a given character as an escape character which can be of use when
the target expression is not a literal string.
Parameters: |
|
---|
sqlalchemy.schema.
MetaData
(bind=None, reflect=False, schema=None, quote_schema=None, naming_convention=None, info=None)¶Bases: sqlalchemy.schema.SchemaItem
A collection of Table
objects and their associated schema
constructs.
Holds a collection of Table
objects as well as
an optional binding to an Engine
or
Connection
. If bound, the Table
objects
in the collection and their columns may participate in implicit SQL
execution.
The Table
objects themselves are stored in the
MetaData.tables
dictionary.
MetaData
is a thread-safe object for read operations.
Construction of new tables within a single MetaData
object,
either explicitly or via reflection, may not be completely thread-safe.
See also
Describing Databases with MetaData - Introduction to database metadata
__init__
(bind=None, reflect=False, schema=None, quote_schema=None, naming_convention=None, info=None)¶Create a new MetaData object.
Parameters: |
|
---|
append_ddl_listener
(event_name, listener)¶Append a DDL event listener to this MetaData
.
Deprecated since version 0.7: the MetaData.append_ddl_listener()
method is deprecated and will be removed in a future release. Please refer to DDLEvents
.
bind
¶An Engine
or Connection
to which this
MetaData
is bound.
Typically, a Engine
is assigned to this attribute
so that “implicit execution” may be used, or alternatively
as a means of providing engine binding information to an
ORM Session
object:
engine = create_engine("someurl://")
metadata.bind = engine
See also
Connectionless Execution, Implicit Execution - background on “bound metadata”
clear
()¶Clear all Table objects from this MetaData.
create_all
(bind=None, tables=None, checkfirst=True)¶Create all tables stored in this metadata.
Conditional by default, will not attempt to recreate tables already present in the target database.
Parameters: |
|
---|
drop_all
(bind=None, tables=None, checkfirst=True)¶Drop all tables stored in this metadata.
Conditional by default, will not attempt to drop tables not present in the target database.
Parameters: |
|
---|
is_bound
()¶True if this MetaData is bound to an Engine or Connection.
reflect
(bind=None, schema=None, views=False, only=None, extend_existing=False, autoload_replace=True, resolve_fks=True, **dialect_kwargs)¶Load all available table definitions from the database.
Automatically creates Table
entries in this MetaData
for any
table available in the database but not yet present in the
MetaData
. May be called multiple times to pick up tables recently
added to the database, however no special action is taken if a table
in this MetaData
no longer exists in the database.
Parameters: |
|
---|
remove
(table)¶Remove the given Table object from this MetaData.
sorted_tables
¶Returns a list of Table
objects sorted in order of
foreign key dependency.
The sorting will place Table
objects that have dependencies
first, before the dependencies themselves, representing the
order in which they can be created. To get the order in which
the tables would be dropped, use the reversed()
Python built-in.
Warning
The sorted_tables
accessor cannot by itself accommodate
automatic resolution of dependency cycles between tables, which
are usually caused by mutually dependent foreign key constraints.
To resolve these cycles, either the
ForeignKeyConstraint.use_alter
parameter may be
applied to those constraints, or use the
schema.sort_tables_and_constraints()
function which will
break out foreign key constraints involved in cycles separately.
tables
= None¶A dictionary of Table
objects keyed to their name or “table key”.
The exact key is that determined by the Table.key
attribute;
for a table with no Table.schema
attribute, this is the same
as Table.name
. For a table with a schema, it is typically of the
form schemaname.tablename
.
See also
sqlalchemy.schema.
SchemaItem
¶Bases: sqlalchemy.sql.expression.SchemaEventTarget
, sqlalchemy.sql.visitors.Visitable
Base class for items that define a database schema.
get_children
(**kwargs)¶used to allow SchemaVisitor access
info
¶Info dictionary associated with the object, allowing user-defined
data to be associated with this SchemaItem
.
The dictionary is automatically generated when first accessed.
It can also be specified in the constructor of some objects,
such as Table
and Column
.
quote
¶Return the value of the quote
flag passed
to this schema object, for those schema items which
have a name
field.
Deprecated since version 0.9: The SchemaItem.quote
attribute is deprecated and will be removed in a future release. Use the quoted_name.quote
attribute on the name
field of the target schema item to retrievequoted status.
sqlalchemy.schema.
Table
(*args, **kw)¶Bases: sqlalchemy.sql.base.DialectKWArgs
, sqlalchemy.schema.SchemaItem
, sqlalchemy.sql.expression.TableClause
Represent a table in a database.
e.g.:
mytable = Table("mytable", metadata,
Column('mytable_id', Integer, primary_key=True),
Column('value', String(50))
)
The Table
object constructs a unique instance of itself based
on its name and optional schema name within the given
MetaData
object. Calling the Table
constructor with the same name and same MetaData
argument
a second time will return the same Table
object - in this way
the Table
constructor acts as a registry function.
See also
Describing Databases with MetaData - Introduction to database metadata
Constructor arguments are as follows:
Parameters: |
|
---|
__eq__
¶__eq__
attribute of object
Return self==value.
__init__
(*args, **kw)¶Constructor for Table
.
This method is a no-op. See the top-level
documentation for Table
for constructor arguments.
__le__
¶__le__
attribute of object
Return self<=value.
__lt__
¶__lt__
attribute of object
Return self<value.
__ne__
¶__ne__
attribute of object
Return self!=value.
add_is_dependent_on
(table)¶Add a ‘dependency’ for this Table.
This is another Table object which must be created first before this one can, or dropped after this one.
Usually, dependencies between tables are determined via ForeignKey objects. However, for other situations that create dependencies outside of foreign keys (rules, inheriting), this method can manually establish such a link.
alias
(name=None, flat=False)¶alias()
method of FromClause
return an alias of this FromClause
.
E.g.:
a2 = some_table.alias('a2')
The above code creates an Alias
object which can be used
as a FROM clause in any SELECT statement.
append_column
(column)¶Append a Column
to this Table
.
The “key” of the newly added Column
, i.e. the
value of its .key
attribute, will then be available
in the .c
collection of this Table
, and the
column definition will be included in any CREATE TABLE, SELECT,
UPDATE, etc. statements generated from this Table
construct.
Note that this does not change the definition of the table as it exists within any underlying database, assuming that table has already been created in the database. Relational databases support the addition of columns to existing tables using the SQL ALTER command, which would need to be emitted for an already-existing table that doesn’t contain the newly added column.
append_constraint
(constraint)¶Append a Constraint
to this
Table
.
This has the effect of the constraint being included in any
future CREATE TABLE statement, assuming specific DDL creation
events have not been associated with the given
Constraint
object.
Note that this does not produce the constraint within the
relational database automatically, for a table that already exists
in the database. To add a constraint to an
existing relational database table, the SQL ALTER command must
be used. SQLAlchemy also provides the
AddConstraint
construct which can produce this SQL when
invoked as an executable clause.
append_ddl_listener
(event_name, listener)¶Append a DDL event listener to this Table
.
Deprecated since version 0.7: the Table.append_ddl_listener()
method is deprecated and will be removed in a future release. Please refer to DDLEvents
.
argument_for
(dialect_name, argument_name, default)¶argument_for()
method of DialectKWArgs
Add a new kind of dialect-specific keyword argument for this class.
E.g.:
Index.argument_for("mydialect", "length", None)
some_index = Index('a', 'b', mydialect_length=5)
The DialectKWArgs.argument_for()
method is a per-argument
way adding extra arguments to the
DefaultDialect.construct_arguments
dictionary. This
dictionary provides a list of argument names accepted by various
schema-level constructs on behalf of a dialect.
New dialects should typically specify this dictionary all at once as a data member of the dialect class. The use case for ad-hoc addition of argument names is typically for end-user code that is also using a custom compilation scheme which consumes the additional arguments.
Parameters: |
|
---|
New in version 0.9.4.
bind
¶Return the connectable associated with this Table.
c
¶c
attribute of FromClause
An alias for the columns
attribute.
columns
¶columns
attribute of FromClause
A named-based collection of ColumnElement
objects
maintained by this FromClause
.
The columns
, or c
collection, is the gateway
to the construction of SQL expressions using table-bound or
other selectable-bound columns:
select([mytable]).where(mytable.c.somecolumn == 5)
compare
(other, **kw)¶compare()
method of ClauseElement
Compare this ClauseElement to the given ClauseElement.
Subclasses should override the default behavior, which is a straight identity comparison.
**kw are arguments consumed by subclass compare() methods and
may be used to modify the criteria for comparison.
(see ColumnElement
)
compile
(default, bind=None, dialect=None, **kw)¶compile()
method of ClauseElement
Compile this SQL expression.
The return value is a Compiled
object.
Calling str()
or unicode()
on the returned value will yield a
string representation of the result. The
Compiled
object also can return a
dictionary of bind parameter names and values
using the params
accessor.
Parameters: |
|
---|
correspond_on_equivalents
(column, equivalents)¶correspond_on_equivalents()
method of FromClause
Return corresponding_column for the given column, or if None search for a match in the given dictionary.
corresponding_column
(column, require_embedded=False)¶corresponding_column()
method of FromClause
Given a ColumnElement
, return the exported
ColumnElement
object from this Selectable
which corresponds to that original
Column
via a common ancestor
column.
Parameters: |
|
---|
count
(functions, whereclause=None, **params)¶count()
method of FromClause
return a SELECT COUNT generated against this
FromClause
.
Deprecated since version 1.1: The FromClause.count()
method is deprecated, and will be removed in a future release. Please use the functions.count
function available from the func
namespace.
See also
create
(bind=None, checkfirst=False)¶Issue a CREATE
statement for this
Table
, using the given Connectable
for connectivity.
See also
delete
(dml, whereclause=None, **kwargs)¶delete()
method of TableClause
Generate a delete()
construct against this
TableClause
.
E.g.:
table.delete().where(table.c.id==7)
See delete()
for argument and usage information.
dialect_kwargs
¶dialect_kwargs
attribute of DialectKWArgs
A collection of keyword arguments specified as dialect-specific options to this construct.
The arguments are present here in their original <dialect>_<kwarg>
format. Only arguments that were actually passed are included;
unlike the DialectKWArgs.dialect_options
collection, which
contains all options known by this dialect including defaults.
The collection is also writable; keys are accepted of the
form <dialect>_<kwarg>
where the value will be assembled
into the list of options.
New in version 0.9.2.
Changed in version 0.9.4: The DialectKWArgs.dialect_kwargs
collection is now writable.
See also
DialectKWArgs.dialect_options
- nested dictionary form
dialect_options
¶dialect_options
attribute of DialectKWArgs
A collection of keyword arguments specified as dialect-specific options to this construct.
This is a two-level nested registry, keyed to <dialect_name>
and <argument_name>
. For example, the postgresql_where
argument would be locatable as:
arg = my_object.dialect_options['postgresql']['where']
New in version 0.9.2.
See also
DialectKWArgs.dialect_kwargs
- flat dictionary form
drop
(bind=None, checkfirst=False)¶Issue a DROP
statement for this
Table
, using the given Connectable
for connectivity.
See also
exists
(bind=None)¶Return True if this table exists.
foreign_key_constraints
¶ForeignKeyConstraint
objects referred to by this
Table
.
This list is produced from the collection of ForeignKey
objects currently associated.
New in version 1.0.0.
foreign_keys
¶foreign_keys
attribute of FromClause
Return the collection of ForeignKey objects which this FromClause references.
get_children
(column_collections=True, schema_visitor=False, **kw)¶used to allow SchemaVisitor access
info
¶info
attribute of SchemaItem
Info dictionary associated with the object, allowing user-defined
data to be associated with this SchemaItem
.
The dictionary is automatically generated when first accessed.
It can also be specified in the constructor of some objects,
such as Table
and Column
.
insert
(dml, values=None, inline=False, **kwargs)¶insert()
method of TableClause
Generate an insert()
construct against this
TableClause
.
E.g.:
table.insert().values(name='foo')
See insert()
for argument and usage information.
is_derived_from
(fromclause)¶is_derived_from()
method of FromClause
Return True if this FromClause is ‘derived’ from the given FromClause.
An example would be an Alias of a Table is derived from that Table.
join
(right, onclause=None, isouter=False, full=False)¶join()
method of FromClause
Return a Join
from this FromClause
to another FromClause
.
E.g.:
from sqlalchemy import join
j = user_table.join(address_table,
user_table.c.id == address_table.c.user_id)
stmt = select([user_table]).select_from(j)
would emit SQL along the lines of:
SELECT user.id, user.name FROM user
JOIN address ON user.id = address.user_id
Parameters: |
|
---|
key
¶Return the ‘key’ for this Table
.
This value is used as the dictionary key within the
MetaData.tables
collection. It is typically the same
as that of Table.name
for a table with no
Table.schema
set; otherwise it is typically of the form
schemaname.tablename
.
kwargs
¶kwargs
attribute of DialectKWArgs
A synonym for DialectKWArgs.dialect_kwargs
.
lateral
(name=None)¶lateral()
method of FromClause
Return a LATERAL alias of this FromClause
.
The return value is the Lateral
construct also
provided by the top-level lateral()
function.
New in version 1.1.
See also
LATERAL correlation - overview of usage.
outerjoin
(right, onclause=None, full=False)¶outerjoin()
method of FromClause
Return a Join
from this FromClause
to another FromClause
, with the “isouter” flag set to
True.
E.g.:
from sqlalchemy import outerjoin
j = user_table.outerjoin(address_table,
user_table.c.id == address_table.c.user_id)
The above is equivalent to:
j = user_table.join(
address_table,
user_table.c.id == address_table.c.user_id,
isouter=True)
Parameters: |
|
---|
primary_key
¶primary_key
attribute of FromClause
Return the collection of Column objects which comprise the primary key of this FromClause.
quote
¶quote
attribute of SchemaItem
Return the value of the quote
flag passed
to this schema object, for those schema items which
have a name
field.
Deprecated since version 0.9: The SchemaItem.quote
attribute is deprecated and will be removed in a future release. Use the quoted_name.quote
attribute on the name
field of the target schema item to retrievequoted status.
quote_schema
¶Return the value of the quote_schema
flag passed
to this Table
.
Deprecated since version 0.9: The SchemaItem.quote()
method is deprecated and will be removed in a future release. Use the quoted_name.quote
attribute on the schema
field of the target schema item to retrieve quoted status.
replace_selectable
(sqlutil, old, alias)¶replace_selectable()
method of FromClause
replace all occurrences of FromClause ‘old’ with the given Alias
object, returning a copy of this FromClause
.
select
(whereclause=None, **params)¶select()
method of FromClause
return a SELECT of this FromClause
.
See also
select()
- general purpose
method which allows for arbitrary column lists.
self_group
(against=None)¶self_group()
method of ClauseElement
Apply a ‘grouping’ to this ClauseElement
.
This method is overridden by subclasses to return a
“grouping” construct, i.e. parenthesis. In particular
it’s used by “binary” expressions to provide a grouping
around themselves when placed into a larger expression,
as well as by select()
constructs when placed into
the FROM clause of another select()
. (Note that
subqueries should be normally created using the
Select.alias()
method, as many platforms require
nested SELECT statements to be named).
As expressions are composed together, the application of
self_group()
is automatic - end-user code should never
need to use this method directly. Note that SQLAlchemy’s
clause constructs take operator precedence into account -
so parenthesis might not be needed, for example, in
an expression like x OR (y AND z)
- AND takes precedence
over OR.
The base self_group()
method of ClauseElement
just returns self.
tablesample
(sampling, name=None, seed=None)¶tablesample()
method of FromClause
Return a TABLESAMPLE alias of this FromClause
.
The return value is the TableSample
construct also
provided by the top-level tablesample()
function.
New in version 1.1.
See also
tablesample()
- usage guidelines and parameters
tometadata
(metadata, schema=symbol('retain_schema'), referred_schema_fn=None, name=None)¶Return a copy of this Table
associated with a different
MetaData
.
E.g.:
m1 = MetaData()
user = Table('user', m1, Column('id', Integer, primary_key=True))
m2 = MetaData()
user_copy = user.tometadata(m2)
Parameters: |
|
---|
update
(dml, whereclause=None, values=None, inline=False, **kwargs)¶update()
method of TableClause
Generate an update()
construct against this
TableClause
.
E.g.:
table.update().where(table.c.id==7).values(name='foo')
See update()
for argument and usage information.
sqlalchemy.schema.
ThreadLocalMetaData
¶Bases: sqlalchemy.schema.MetaData
A MetaData variant that presents a different bind
in every thread.
Makes the bind
property of the MetaData a thread-local value, allowing
this collection of tables to be bound to different Engine
implementations or connections in each thread.
The ThreadLocalMetaData starts off bound to None in each thread. Binds
must be made explicitly by assigning to the bind
property or using
connect()
. You can also re-bind dynamically multiple times per
thread, just like a regular MetaData
.
__init__
()¶Construct a ThreadLocalMetaData.
bind
¶The bound Engine or Connection for this thread.
This property may be assigned an Engine or Connection, or assigned a
string or URL to automatically create a basic Engine for this bind
with create_engine()
.
dispose
()¶Dispose all bound engines, in all thread contexts.
is_bound
()¶True if there is a bind for this thread.