.. function:: connect(database[, timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements, uri])
- Opens a connection to the SQLite database file *database*. You can use
- ``":memory:"`` to open a database connection to a database that resides in RAM
- instead of on disk.
+ Opens a connection to the SQLite database file *database*. By default returns a
+ :class:`Connection` object, unless a custom *factory* is given.
+
+ *database* is a :term:`path-like object` giving the pathname (absolute or
+ relative to the current working directory) of the database file to be opened.
+ You can use ``":memory:"`` to open a database connection to a database that
+ resides in RAM instead of on disk.
When a database is accessed by multiple connections, and one of the processes
modifies the database, the SQLite database is locked until that transaction is
.. versionchanged:: 3.4
Added the *uri* parameter.
+ .. versionchanged:: 3.7
+ *database* can now also be a :term:`path-like object`, not only a string.
+
.. function:: register_converter(typename, callable)
with self.assertRaises(AttributeError):
self.cx.in_transaction = True
+ def CheckOpenWithPathLikeObject(self):
+ """ Checks that we can succesfully connect to a database using an object that
+ is PathLike, i.e. has __fspath__(). """
+ self.addCleanup(unlink, TESTFN)
+ class Path:
+ def __fspath__(self):
+ return TESTFN
+ path = Path()
+ with sqlite.connect(path) as cx:
+ cx.execute('create table test(id integer)')
+
def CheckOpenUri(self):
if sqlite.sqlite_version_info < (3, 7, 7):
with self.assertRaises(sqlite.NotSupportedError):
--- /dev/null
+*database* argument of sqlite3.connect() now accepts a
+:term:`path-like object`, instead of just a string.
};
char* database;
+ PyObject* database_obj;
int detect_types = 0;
PyObject* isolation_level = NULL;
PyObject* factory = NULL;
double timeout = 5.0;
int rc;
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|diOiOip", kwlist,
- &database, &timeout, &detect_types,
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|diOiOip", kwlist,
+ PyUnicode_FSConverter, &database_obj, &timeout, &detect_types,
&isolation_level, &check_same_thread,
&factory, &cached_statements, &uri))
{
return -1;
}
+ database = PyBytes_AsString(database_obj);
+
self->initialized = 1;
self->begin_statement = NULL;
#endif
Py_END_ALLOW_THREADS
+ Py_DECREF(database_obj);
+
if (rc != SQLITE_OK) {
_pysqlite_seterror(self->db, NULL);
return -1;
"check_same_thread", "factory", "cached_statements", "uri",
NULL
};
- char* database;
+ PyObject* database;
int detect_types = 0;
PyObject* isolation_level;
PyObject* factory = NULL;
PyObject* result;
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|diOiOip", kwlist,
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|diOiOip", kwlist,
&database, &timeout, &detect_types,
&isolation_level, &check_same_thread,
&factory, &cached_statements, &uri))