250 lines
15 KiB
HTML
250 lines
15 KiB
HTML
|
<!DOCTYPE html>
|
||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||
|
<head>
|
||
|
<meta charset="utf-8"/>
|
||
|
<title>Clojure Guides: java.jdbc - Using DDL and Metadata</title>
|
||
|
|
||
|
|
||
|
<meta name="description" content="Contents">
|
||
|
|
||
|
<meta property="og:description" content="Contents">
|
||
|
|
||
|
<meta property="og:url" content="https://clojure-doc.github.io/articles/ecosystem/java_jdbc/using_ddl/" />
|
||
|
<meta property="og:title" content="java.jdbc - Using DDL and Metadata" />
|
||
|
<meta property="og:type" content="article" />
|
||
|
|
||
|
<link rel="canonical" href="https://clojure-doc.github.io/articles/ecosystem/java_jdbc/using_ddl/">
|
||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
|
<link href="https://fonts.googleapis.com/css?family=Alegreya:400italic,700italic,400,700" rel="stylesheet"
|
||
|
type="text/css">
|
||
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css">
|
||
|
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
|
||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/default.min.css">
|
||
|
<link href="../../../css/screen.css" rel="stylesheet" type="text/css" />
|
||
|
</head>
|
||
|
<body>
|
||
|
|
||
|
|
||
|
<nav class="navbar navbar-default">
|
||
|
<div class="container">
|
||
|
<div class="navbar-header">
|
||
|
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
|
||
|
<span class="sr-only">Toggle navigation</span>
|
||
|
<span class="icon-bar"></span>
|
||
|
<span class="icon-bar"></span>
|
||
|
<span class="icon-bar"></span>
|
||
|
</button>
|
||
|
<a class="navbar-brand" href="../../../index.html">Clojure Guides</a>
|
||
|
</div>
|
||
|
<div id="navbar" class="navbar-collapse collapse">
|
||
|
<ul class="nav navbar-nav navbar-right">
|
||
|
<li ><a href="../../../index.html">Home</a></li>
|
||
|
<li><a href="https://github.com/clojure-doc/clojure-doc.github.io">Contribute</a></li>
|
||
|
</ul>
|
||
|
</div><!--/.nav-collapse -->
|
||
|
</div><!--/.container-fluid -->
|
||
|
</nav>
|
||
|
|
||
|
|
||
|
<div class="container">
|
||
|
|
||
|
|
||
|
<div class="row">
|
||
|
<div class="col-lg-9">
|
||
|
<div id="content">
|
||
|
|
||
|
<div id="custom-page">
|
||
|
<div id="page-header">
|
||
|
<h2>java.jdbc - Using DDL and Metadata</h2>
|
||
|
</div>
|
||
|
|
||
|
<h2 id="contents">Contents</h2><ul><li><a href="home.html">Overview</a></li><li><a href="using_sql.html">Using SQL</a></li><li><a href="using_ddl.html">Using DDL</a></li><li><a href="reusing_connections.html">Reusing Connections</a></li></ul><h2 id="using-ddl">Using DDL</h2><p>DDL operations can be executed using the <code>db-do-commands</code> function. The general
|
||
|
approach is:</p><pre><code class="clojure">(jdbc/db-do-commands db-spec [sql-command-1 sql-command-2 .. sql-command-n])
|
||
|
</code></pre><p>The commands are executed as a single, batched statement, wrapped in a
|
||
|
transaction. If you want to avoid the transaction, use this approach:</p><pre><code class="clojure">(jdbc/db-do-commands db-spec false [sql-command-1 sql-command-2 .. sql-command-n])
|
||
|
</code></pre><p>This is necessary for some databases that do not allow DDL operations to be
|
||
|
wrapped in a transaction.</p><h3 id="creating-tables">Creating tables</h3><p>For the common operations of creating and dropping tables, <code>java.jdbc</code> provides a
|
||
|
little assistance that recognizes <code>:entities</code> so you can use keywords (or
|
||
|
strings) and have your chosen naming strategy applied, just as you can for
|
||
|
several of the SQL functions.</p><pre><code class="clojure">(jdbc/create-table-ddl :fruit
|
||
|
[[:name "varchar(32)" :primary :key]
|
||
|
[:appearance "varchar(32)"]
|
||
|
[:cost :int]
|
||
|
[:grade :real]]
|
||
|
{:table-spec "ENGINE=InnoDB"
|
||
|
:entities clojure.string/upper-case})
|
||
|
</code></pre><p>This will generate:</p><pre><code class="clojure">CREATE TABLE FRUIT
|
||
|
(NAME varchar(32) primary key,
|
||
|
APPEARANCE varchar(32),
|
||
|
COST int,
|
||
|
GRADE real) ENGINE=InnoDB
|
||
|
</code></pre><p>which you can pass to <code>db-do-commands</code>.</p><p><code>create-table-ddl</code> also supports a <code>conditional?</code> option which can be a simple
|
||
|
<code>Boolean</code>, which, if <code>true</code>, will add <code>IF NOT EXISTS</code> before the table name. If
|
||
|
that syntax doesn't work for your database, you can pass a string that will be
|
||
|
used instead. If that isn't enough, you can pass a function of two arguments:
|
||
|
the first argument will be the table name and the second argument will be the
|
||
|
DDL string (this approach is needed for Microsoft SQL Server).</p><h3 id="dropping-tables">Dropping tables</h3><p>Similarly there is a <code>drop-table-ddl</code> function which takes a table name and an
|
||
|
optional <code>:entities</code> option to generate DDL to drop a table.</p><pre><code class="clojure">(jdbc/drop-table-ddl :fruit) ; drop table fruit
|
||
|
(jdbc/drop-table-ddl :fruit {:entities clojure.string/upper-case}) ; drop table FRUIT
|
||
|
</code></pre><p>This will generate:</p><pre><code class="clojure">DROP TABLE FRUIT
|
||
|
</code></pre><p><code>drop-table-ddl</code> also supports a <code>conditional?</code> option which can be a simple
|
||
|
<code>Boolean</code>, which, if <code>true</code>, will add <code>IF EXISTS</code> before the table name. If
|
||
|
that syntax doesn't work for your database, you can pass a string that will be
|
||
|
used instead. If that isn't enough, you can pass a function of two arguments:
|
||
|
the first argument will be the table name and the second argument will be the
|
||
|
DDL string (this approach is needed for Microsoft SQL Server).</p><h2 id="accessing-metadata">Accessing metadata</h2><p><code>java.jdbc</code> provides two functions for working with database metadata:</p><ul><li><code>with-db-metadata</code> for creating an active metadata object backed by an open
|
||
|
connection</li><li><code>metadata-result</code> for turning metadata results into Clojure data structures</li></ul><p>For example:</p><pre><code class="clojure">(jdbc/with-db-metadata [md db-spec]
|
||
|
(jdbc/metadata-result (.getTables md nil nil nil (into-array ["TABLE" "VIEW"]))))
|
||
|
</code></pre><p>This returns a sequence of maps describing all the tables and views in the
|
||
|
current database. <code>metadata-result</code> only transforms <code>ResultSet</code> objects, other
|
||
|
results are returned as-is. <code>metadata-result</code> can also accept an options map
|
||
|
containing <code>:identifiers</code> and <code>:as-arrays?</code>, like the <code>query</code> function,
|
||
|
and those options control how the metatadata is transformed and/or returned.</p><p>Both <code>with-db-metadata</code> and <code>metadata-result</code> can accept an options hash map
|
||
|
which will be passed through various <code>java.jdbc</code> functions (<code>get-connections</code>
|
||
|
for the former and <code>result-set-seq</code> for the latter).</p>
|
||
|
|
||
|
<div id="prev-next">
|
||
|
|
||
|
<a href="using_sql.html">« java.jdbc - Manipulating data with SQL</a>
|
||
|
|
||
|
|
||
|
||
|
||
|
|
||
|
|
||
|
<a href="reusing_connections.html">java.jdbc - How to reuse database connections »</a>
|
||
|
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div class="col-md-3">
|
||
|
<div id="sidebar">
|
||
|
<h3>Links</h3>
|
||
|
<ul id="links">
|
||
|
|
||
|
<li><a href="../../about/index.html">About</a></li>
|
||
|
|
||
|
<li><a href="../../content/index.html">Table of Contents</a></li>
|
||
|
|
||
|
<li><a href="../../tutorials/getting_started/index.html">Getting Started with Clojure</a></li>
|
||
|
|
||
|
<li><a href="../../tutorials/introduction/index.html">Introduction to Clojure</a></li>
|
||
|
|
||
|
<li><a href="../../tutorials/emacs/index.html">Clojure with Emacs</a></li>
|
||
|
|
||
|
<li><a href="../../tutorials/vim_fireplace/index.html">Clojure with Vim and fireplace.vim</a></li>
|
||
|
|
||
|
<li><a href="../../tutorials/eclipse/index.html">Starting with Eclipse and Counterclockwise For Clojure Development</a></li>
|
||
|
|
||
|
<li><a href="../../tutorials/basic_web_development/index.html">Basic Web Development</a></li>
|
||
|
|
||
|
<li><a href="../../tutorials/parsing_xml_with_zippers/index.html">Parsing XML in Clojure</a></li>
|
||
|
|
||
|
<li><a href="../../tutorials/growing_a_dsl_with_clojure/index.html">Growing a DSL with Clojure</a></li>
|
||
|
|
||
|
<li><a href="../../language/core_overview/index.html">Overview of clojure.core, the standard Clojure library</a></li>
|
||
|
|
||
|
<li><a href="../../language/namespaces/index.html">Clojure Namespaces and Vars</a></li>
|
||
|
|
||
|
<li><a href="../../language/collections_and_sequences/index.html">Collections and Sequences in Clojure</a></li>
|
||
|
|
||
|
<li><a href="../../language/functions/index.html">Functions in Clojure</a></li>
|
||
|
|
||
|
<li><a href="../../language/laziness/index.html">Laziness in Clojure</a></li>
|
||
|
|
||
|
<li><a href="../../language/interop/index.html">Clojure interoperability with Java</a></li>
|
||
|
|
||
|
<li><a href="../../language/macros/index.html">Clojure Macros and Metaprogramming</a></li>
|
||
|
|
||
|
<li><a href="../../language/polymorphism/index.html">Polymorphism in Clojure: Protocols and Multimethods</a></li>
|
||
|
|
||
|
<li><a href="../../language/concurrency_and_parallelism/index.html">Concurrency and Parallelism in Clojure</a></li>
|
||
|
|
||
|
<li><a href="../../language/glossary/index.html">Clojure Terminology Guide</a></li>
|
||
|
|
||
|
<li><a href="../libraries_directory/index.html">A Directory of Clojure Libraries</a></li>
|
||
|
|
||
|
<li><a href="../libraries_authoring/index.html">Library Development and Distribution</a></li>
|
||
|
|
||
|
<li><a href="../generating_documentation/index.html">Generating Documentation</a></li>
|
||
|
|
||
|
<li><a href="../data_processing/index.html">Data Processing (Help Wanted)</a></li>
|
||
|
|
||
|
<li><a href="../web_development/index.html">Web Development (Overview)</a></li>
|
||
|
|
||
|
<li><a href="../maven/index.html">How to use Maven to build Clojure projects</a></li>
|
||
|
|
||
|
<li><a href="../community/index.html">Clojure Community</a></li>
|
||
|
|
||
|
<li><a href="../user_groups/index.html">Clojure User Groups</a></li>
|
||
|
|
||
|
<li><a href="../running_cljug/index.html">Running a Clojure User Group</a></li>
|
||
|
|
||
|
<li><a href="../books/index.html">Books about Clojure and ClojureScript</a></li>
|
||
|
|
||
|
<li><a href="../../cookbooks/data_structures/index.html">Data Structures (Help wanted)</a></li>
|
||
|
|
||
|
<li><a href="../../cookbooks/strings/index.html">Strings</a></li>
|
||
|
|
||
|
<li><a href="../../cookbooks/math/index.html">Mathematics with Clojure</a></li>
|
||
|
|
||
|
<li><a href="../../cookbooks/date_and_time/index.html">Date and Time (Help wanted)</a></li>
|
||
|
|
||
|
<li><a href="../../cookbooks/files_and_directories/index.html">Working with Files and Directories in Clojure</a></li>
|
||
|
|
||
|
<li><a href="../../cookbooks/middleware/index.html">Middleware in Clojure</a></li>
|
||
|
|
||
|
<li><a href="home.html">java.jdbc - Getting Started</a></li>
|
||
|
|
||
|
<li><a href="using_sql.html">java.jdbc - Manipulating data with SQL</a></li>
|
||
|
|
||
|
<li><a href="using_ddl.html">java.jdbc - Using DDL and Metadata</a></li>
|
||
|
|
||
|
<li><a href="reusing_connections.html">java.jdbc - How to reuse database connections</a></li>
|
||
|
|
||
|
<li><a href="../core_typed/home/index.html">core.typed - User Documentation Home</a></li>
|
||
|
|
||
|
<li><a href="../core_typed/user_documentation/index.html">core.typed - User Documentation</a></li>
|
||
|
|
||
|
<li><a href="../core_typed/rationale/index.html">core.typed - Rationale</a></li>
|
||
|
|
||
|
<li><a href="../core_typed/quick_guide.html">core.typed - Quick Guide</a></li>
|
||
|
|
||
|
<li><a href="../core_typed/start/introduction_and_motivation/index.html">core.typed - Getting Started: Introduction and Motivation</a></li>
|
||
|
|
||
|
<li><a href="../core_typed/types/index.html">core.typed - Types</a></li>
|
||
|
|
||
|
<li><a href="../core_typed/start/annotations/index.html">core.typed - Annotations</a></li>
|
||
|
|
||
|
<li><a href="../core_typed/poly_fn/index.html">core.typed - Polymorphic Functions</a></li>
|
||
|
|
||
|
<li><a href="../core_typed/filters/index.html">core.typed - Filters</a></li>
|
||
|
|
||
|
<li><a href="../core_typed/mm_protocol_datatypes/index.html">core.typed - Protocols</a></li>
|
||
|
|
||
|
<li><a href="../core_typed/loops/index.html">core.typed - Looping constructs</a></li>
|
||
|
|
||
|
<li><a href="../core_typed/function_types/index.html">core.typed - Functions</a></li>
|
||
|
|
||
|
<li><a href="../core_typed/limitations/index.html">core.typed - Limitations</a></li>
|
||
|
|
||
|
</ul>
|
||
|
|
||
|
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
<footer>Copyright © 2021 Multiple Authors
|
||
|
<p style="text-align: center;">Powered by <a href="http://cryogenweb.org">Cryogen</a></p></footer>
|
||
|
</div>
|
||
|
<script src="https://code.jquery.com/jquery-1.11.0.min.js"></script>
|
||
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
|
||
|
<script src="../../../js/highlight.pack.js" type="application/javascript"></script>
|
||
|
<script>hljs.initHighlightingOnLoad();</script>
|
||
|
|
||
|
|
||
|
</body>
|
||
|
</html>
|