Prepares a query string, returning a :class:`~cassandra.query.PreparedStatement` instance which can be used as follows:: >>> session = cluster.connect("mykeyspace") >>> query = "INSERT INTO users (id, name, age) VALUES (?, ?, ?)" >>> prepared = s
(self, query, custom_payload=None, keyspace=None)
| 3139 | fn(response_future, *args, **kwargs) |
| 3140 | |
| 3141 | def prepare(self, query, custom_payload=None, keyspace=None): |
| 3142 | """ |
| 3143 | Prepares a query string, returning a :class:`~cassandra.query.PreparedStatement` |
| 3144 | instance which can be used as follows:: |
| 3145 | |
| 3146 | >>> session = cluster.connect("mykeyspace") |
| 3147 | >>> query = "INSERT INTO users (id, name, age) VALUES (?, ?, ?)" |
| 3148 | >>> prepared = session.prepare(query) |
| 3149 | >>> session.execute(prepared, (user.id, user.name, user.age)) |
| 3150 | |
| 3151 | Or you may bind values to the prepared statement ahead of time:: |
| 3152 | |
| 3153 | >>> prepared = session.prepare(query) |
| 3154 | >>> bound_stmt = prepared.bind((user.id, user.name, user.age)) |
| 3155 | >>> session.execute(bound_stmt) |
| 3156 | |
| 3157 | Of course, prepared statements may (and should) be reused:: |
| 3158 | |
| 3159 | >>> prepared = session.prepare(query) |
| 3160 | >>> for user in users: |
| 3161 | ... bound = prepared.bind((user.id, user.name, user.age)) |
| 3162 | ... session.execute(bound) |
| 3163 | |
| 3164 | Alternatively, if :attr:`~.Cluster.protocol_version` is 5 or higher |
| 3165 | (requires Cassandra 4.0+), the keyspace can be specified as a |
| 3166 | parameter. This will allow you to avoid specifying the keyspace in the |
| 3167 | query without specifying a keyspace in :meth:`~.Cluster.connect`. It |
| 3168 | even will let you prepare and use statements against a keyspace other |
| 3169 | than the one originally specified on connection: |
| 3170 | |
| 3171 | >>> analyticskeyspace_prepared = session.prepare( |
| 3172 | ... "INSERT INTO user_activity id, last_activity VALUES (?, ?)", |
| 3173 | ... keyspace="analyticskeyspace") # note the different keyspace |
| 3174 | |
| 3175 | **Important**: PreparedStatements should be prepared only once. |
| 3176 | Preparing the same query more than once will likely affect performance. |
| 3177 | |
| 3178 | `custom_payload` is a key value map to be passed along with the prepare |
| 3179 | message. See :ref:`custom_payload`. |
| 3180 | """ |
| 3181 | message = PrepareMessage(query=query, keyspace=keyspace) |
| 3182 | future = ResponseFuture(self, message, query=None, timeout=self.default_timeout) |
| 3183 | try: |
| 3184 | future.send_request() |
| 3185 | response = future.result().one() |
| 3186 | except Exception: |
| 3187 | log.exception("Error preparing query:") |
| 3188 | raise |
| 3189 | |
| 3190 | prepared_keyspace = keyspace if keyspace else None |
| 3191 | prepared_statement = PreparedStatement.from_message( |
| 3192 | response.query_id, response.bind_metadata, response.pk_indexes, self.cluster.metadata, query, prepared_keyspace, |
| 3193 | self._protocol_version, response.column_metadata, response.result_metadata_id, self.cluster.column_encryption_policy) |
| 3194 | prepared_statement.custom_payload = future.custom_payload |
| 3195 | |
| 3196 | self.cluster.add_prepared(response.query_id, prepared_statement) |
| 3197 | |
| 3198 | if self.cluster.prepare_on_all_hosts: |